LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> Ruby III.

Vítám Vás všechny u dalšího dílu o Ruby. Minule jsme se podívali na základní syntaxe a na konci jsem pro Vás měl příklad. Jeho vyřešení najdete na konci článku. Dneska se podíváme, jak se pracuje v Ruby s polem a slovníkem.

20.1.2012 21:00 | Jakub Lares | Články autora | přečteno 5179×

Pole

Pole v podstatě slouží k uložení více objektů do jedné proměnné. Objekty jsou očíslovány a jsou indexovány od 0. To znamená, že první objekt je v poli na pozici 0, druhý na pozici 1 atd.

Definice pole

Vytvoření pole v Ruby je jednoduché, nemusíme mu vyhrazovat paměť ani nic podobného. Prázdné pole vytvoříme dvěma způsoby.


pole = []
pole = Array.new

Pole máme vytvořené a můžeme do něj přidávat libovolné objekty.

V případě, že chceme mít v poli už od vytvoření objekty, píšeme do hranatých závorek názvy objektů, které oddělujeme čárkou.


a = "a"
pole = [a,"ahoj",12]

Vytvořilo se nám pole se třemi prvky, které můžeme vypsat pomoci příkazu p.


p pole

výstup


["a", "ahoj", 12]

Pro vypsání pole na prvním místě použijeme příkaz puts název pole a index objektu, který chceme vypsat.


puts pole[1]

výstup


Ahoj

Vypsat se dá i více prvků, než jeden, to je pro změnu pomocí p jména pole a do závorek píšeme odděleně čárkou indexy.


p pole[1,2]

výstup


["ahoj", 12]

Objekty se dají samozřejmě i přepisovat. Napsáním název_pole[index_objektu] = objekt.


pole[0] = "zmeneno"
puts pole[0]

výstup


Zmeneno

Přidávání a odebírání prvků

Pokud potřebujeme přidat do pole další objekt, použijeme operátor <<. Daný objekt, který přidáme, se zařadí za poslední objekt v poli. Jako náhradu za << můžeme použít metodu .push.


pole = Array.new
pole << "ahoj"
pole << "auto"
pole.push "bus"
p pole

výstup


["ahoj", "auto", "bus"]

Pro odstranění tu máme pár příkazů. Pro odstranění pomocí indexu použijeme metodu .delete_at(index_objektu) a vymazání podle názvu metodu .delete název_objektu.


pole.delete_at(1)
pole.delete "bus"
p pole

výstup

["ahoj"]

Pokud potřebujeme odstranit poslední objekt z pole použijeme metodu .pop a pro odstranění prvního prvku v poli použijeme metodu .shift. Pokud použijeme metodu .shift, všechny ostatní prvky se přeindexují a jejich index se zmenší o číslo jedna. Tím nastane, že nebude po vymazání prvního indexu v poli prázdné místo.

Sčítání polí

Pole můžeme i sčítat pomocí operátoru +.


pole1 = [1,2]
pole2 = [2,3]
pole3 = pole1 + pole2
p pole3

výstup


[1, 2, 2, 3]

Slovník

Obyčejné pole je velmi efektivní struktura pro ukládání a vyhledávání prvků, pokud známe jejich přesný index (tedy místo, kam prvek uložit nebo odkud ho načíst). Někdy ale potřebujeme pracovat s takovými daty, u kterých nezáleží na přesné pozici jednotlivých prvků, ale potřebujeme spíše umět vyhledávat jednotlivé objekty podle nějakého klíče. Pokud bychom např. uložili do obyčejného pole celý anglicko-český slovník, tak by v případě dotazu na jednotlivé slovo bylo nutné celé pole postupně procházet, což by bylo velmi časově náročné. Pro implementaci datových struktur, které obsahují páry klíč-hodnota a u kterých nezáleží na pořadí uložených prvků, je nejlepší použít datovou strukturu, která se nazývá slovník nebo asociativní pole (v Ruby implementováno třídou Hash). Při používání slovníku se objekty neukládají na jednotlivé pozice. Místo toho se každý každý objekt sdruží s nějakým klíčem (tento klíč bývá obvykle textový řetězec) a pomocí tohoto klíče lze příslušný objekt kdykoliv jednoduše vyhledat.

Definice slovníku

Slovník vytvoříme pomocí Hash.new. Hodnoty se do slovníku ukládají nazev_slovniku["klic"]= "hodnota"


slovnik = Hash.new
slovnik["dog"] = "pes"
slovnik["cat"] = "kocka"
p slovnik

výstup


{"dog"=>"pes", "cat"=>"kocka"}

Maže se pomocí metody .delete("klic")

Další možností jak nadefinovat slovník je pomocí literálů.

slovnik = { "dog" => "pes",
            "cat" => "kocka"
            
           }
p slovnik

výstup


{"dog"=>"pes", "cat"=>"kocka"}

Kombinace pole a slovníku

Pole a slovníky můžeme libovolně kombinovat, jelikož součástí pole a slovníku může být kterýkoliv objekt. Ukážeme si malou databázi uživatelů a jak se v takové vnořené struktuře pohybovat. Vytvoříme si pole users a prvkem pole bude slovník se jménem uživatele, kde bydlí a věk.


users = []
users << {"name" => "pepa", "city" => "prague", "age" => 45}
users << {"name" => "kuba", "city" => "ostrava", "age" => 20}
p users

výstup


[{"name"=>"pepa", "city"=>"prague", "age"=>45}, {"name"=>"kuba", "city"=>"ostrava", "age"=>20}]

Takto vypíšeme data prvního uživatele.


p users[0]

A tento příkaz nám vypíše pouze jeho jméno. Takto si můžeme zjišťovat různé informace o uživatelých.


puts users[0]["name"]

Iterace přes prvky pole

Pro vypsání všech prvků slouží iterace. Iterace se se provádí zavoláním metody each na pole, které chceme iterovat a blok kódu mezi do a end. Pro práci s prvkem, který zrovna iterujeme, si ho musíme uložit do libovolné proměnné kterou definujeme za slovo do a umístíme do ||.


languages = ["cestina", "anglictina", "ruby"]
languages.each do |language|
puts language
end

výstup


cestina
anglictina
ruby

Iterace s indexem

Může se nám stát, že budeme potřebovat počítat, kolikrát se iterace provedla. Místo metody each použijeme metodu each_with_index. Plus si musíme nadefinovat proměnou, do které se nám toto číslo bude ukládat. V následujícím příkladu je to proměnná i. Index se počítá od nuly.


languages = ["cestina", "anglictina", "ruby"]
languages.each_with_index do |language,i|
puts "Muj #{i+1}. neoblibenejsi jazky je #{language}."
End

výstup


Muj 1. neoblibenejsi jazky je cestina.
Muj 2. neoblibenejsi jazky je anglictina.
Muj 3. neoblibenejsi jazky je ruby.

Iterace nad slovníkem

Iterovat lze i nad slovníkem, rozdíl mezi iterací nad slovníkem a polem je, že slovník má dva prvky, které při iteraci ukládá. Do první proměnné uloží klíč do druhé hodnotu. Jak se proměnné budou jmenovat je znovu na nás, stejně jako u pole.


languages = {"dog" => "pes", "cat" => "kocka", "fish" => "ryba"}
languages.each do |english, czech|
puts "#{english} cesky znamena #{czech}"
end

výstup


dog cesky znamena pes
cat cesky znamena kocka
fish cesky znamena ryba

Operace nad polem

Nad polem můžeme i různě operovat. Ukážeme si pár základních. Například metoda sort, nám setřídí pole podle abecedy. V Ruby je také rozdíl, jestli voláme metody s ! nebo bez. Když zavoláme metodu sort bez vykřičníku, se samotným polem se nám nic nestane, můžeme si například vypsat, jak by to vypadalo. Pokud použijeme metodu s vykřičníkem, změní nám to samotné pole. Pro lepší pochopení následující příklad.


pole = ["a","c","g","b"]
p pole.sort #vypíše se nám seřazené pole, ale po provedení příkazu, se zase vrátí do původního stavu.
pole.sort #seřadí pole, ale zase ho to vrátí.
p pole
pole.sort! #seřadí pole a nechá ho seřazené protože jsme použili za metodou !. ekvivalent tohoto
           #příkazu je pole = pole.sort
p pole

výstup


["a", "b", "c", "g"]
["a", "c", "g", "b"]
["a", "b", "c", "g"]

Máme zde další sadu metod a tou jsou metody s ?. Například metoda include?. Metody s ? májí návratovou hodnotu true nebo false.

p pole.include?("a")

výstup


True

Metoda select, projede pole a vypíše pouze prvky, které splňují námi zadanou podmínku, například jsou delší než 1.


p pole.select {|element| element.length > 1}

Výstupem není nic, protože všechny prvky co máme v poli jsou jednopísmenné, tudíž nejsou větší než jedna.

Operace nad slovníkem

Podobně jako nad polem, lze používat metody i nad slovníkem. Hodit by se mohli například metody keys nebo values. Ty vypíšou v poly všechny klíče nebo hodnoty slovníku. Poté metody has_key("klic_ktery_chceme_vyhledat") a has_value?("klic_ktery_chceme_vyhledat").

Kombinace

Metody můžeme samozřejmě kombinovat a řetězit na sebe. Jako příklad uvedu vybrání nejstaršího člověka z malinké databáze lidí.


users = [
{"jmeno" => "Pepa", "mesto" => "Praha", "rok_narozeni" => 1980 },  
{"jmeno" => "Jarda", "mesto" => "Brno", "rok_narozeni" => 1960 }, 
{"jmeno" => "Tomas", "mesto" => "Ostrava", "rok_narozeni" => 1992 }, 
]

p users.find {|u| u["rok_narozeni"] == users.map{|u| u["rok_narozeni"]}.min}

výstup


{"jmeno"=>"Pepa", "mesto"=>"Praha", "rok_narozeni"=>1960}

Vyřešené úkoly z minula

Koule a krychle


puts "Zadejte stranu a" 
a = gets.to_i
PI = 3.14
puts "Povrch krychle je #{(a*a)*6}"
puts "Objem krychle je #{a*a*a}"
puts "Povrch koule je #{PI*(a*a)}"
puts "Objem koule je #{(PI*(a*a*a))/6}"

Pravoúhlý trojúhelník


puts "Zadejte stranu a"
a = gets.to_i
puts "Zadejte stranu b"
b = gets.to_i
c = Math.sqrt((a*a + b*b))
puts "Delka prepony je #{c}"
puts "Obvod trojuhleniku je #{a + b + c}"
puts "Obsah trojuhelniku je #{(a*b)/2}"

Pokud máte otázku k příkladům, pište do komentářů nebo na mail laresjakub@gmail.com.

Závěr

Toto je pro dnešek konec, příště si ukážeme jak si vytvořit vlastní metody a nějaké strukturované programy.

Verze pro tisk

pridej.cz

 

DISKUZE

Dotaz 8.2.2012 22:44 Jiří Chromečka




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

15.5.2017 23:50 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 18. května od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

12.5.2017 16:42 /Honza Javorek
PyCon CZ, česká konference o programovacím jazyce Python, se po dvou úspěšných ročnících v Brně bude letos konat v Praze, a to 8. až 10. června. Na konferenci letos zavítá např. i Armin Ronacher, známý především jako autor frameworku Flask, šablon Jinja2/Twig, a dalších projektů. Těšit se můžete na přednášky o datové analytice, tvorbě webu, testování, tvorbě API, učení a mentorování programování, přednášky o rozvoji komunity, o použití Pythonu ve vědě nebo k ovládání nejrůznějších zařízení (MicroPython). Na vlastní prsty si můžete na workshopech vyzkoušet postavit Pythonem ovládaného robota, naučit se učit šestileté děti programovat, efektivně testovat nebo si v Pythonu pohrát s kartografickým materiálem. Kupujte lístky, dokud jsou.
Přidat komentář

2.5.2017 9:20 /Eva Rázgová
Putovní konference československé Drupal komunity "DrupalCamp Československo" se tentokrát koná 27. 5.2017 na VUT FIT v Brně. Můžete načerpat a vyměnit si zkušenosti z oblasti Drupalu 7 a 8, UX, SEO, managementu týmového vývoje, využití Dockeru pro Drupal a dalších. Vítáni jsou nováčci i experti. Akci pořádají Slovenská Drupal Asociácia a česká Asociace pro Drupal. Registrace na webu .
Přidat komentář

1.5.2017 20:31 /Pavel `Goldenfish' Kysilka
PR: 25.5.2017 proběhne v Praze konference na téma Firemní informační systémy. Hlavními tématy jsou: Informační systémy s vlastní inteligencí, efektivní práce s dokumenty, mobilní přístup k datům nebo využívání cloudu.
Přidat komentář

15.4.2017 15:20 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě IoT a radiokomunikace? Přijď na sraz spolku OpenAlt, který se bude konat ve středu 19. dubna od 18:30 v Šenkovně (Sokolská 60, Praha 2).
Přidat komentář

5.3.2017 19:12 /Redakce Linuxsoft.cz
PR: 23. března proběhne v Praze konferenci na téma Cloud computing v praxi. Hlavními tématy jsou: Nejžhavější trendy v oblasti cloudu a cloudových řešení, Moderní cloudové služby, Infrastruktura současných cloudů, Efektivní využití cloudu, Nástrahy cloudových řešení a jak se jim vyhnout.
Přidat komentář

27.2.2017 22:12 /František Kučera
Pozvánka na 137. sraz OpenAlt – Praha: Tentokrát jsme si pro vás připravili neobvyklou akci. Ve středu 1.3. v 17:30 nás přivítá sdružení CZ.NIC ve svých prostorách v Milešovské ulici číslo 5 na Praze 3, kde si pro nás připravili krátkou prezentaci jejich činnosti. Následně navštívíme jejich datacentrum pod Žižkovskou věží. Provedou nás prostory, které jsou běžnému smrtelníkovi nedostupné!
Po ukončení prohlídky se všchni odebereme do hostince U vodoucha, Jagelonská 21, Praha 3 pochutnat si na některém z vybraných piv či dát si něco na zub. Rezervaci máme od 19:30, heslo je OpenAlt.
Ale pozor! Do prostor datového centra máme omezený přístup, dostane se tam pouze 10 lidí! Takže kdo přijde dříve, ten má přednost, a občanky s sebou! Kdo nebude chtít na prohlídku datového centra, může se pomalu přesunout do hostince U vodoucha a u nepřeberné nabídky piv počkat na ostatní.
Přidat komentář

18.1.2017 0:49 /František Kučera
Členové a příznivci spolku OpenAlt se pravidelně schází v Praze a Brně. Fotky z pražských srazů za uplynulý rok si můžete prohlédnout na stránkách spolku. Příští sraz se koná už 19. ledna – tentokrát je tématem ergonomie ovládání počítače – tzn. klávesnice, myši a další zařízení. Také budete mít příležitost si prohlédnout pražský hackerspace Brmlab.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

1.8.2017 7:32 / Cassidy
structural consultants

30.7.2017 11:12 / Jaromir Obr
Národní znaky

27.7.2017 12:24 / Jaromir Obr
Cteni/zapis

26.7.2017 21:12 / Jaromir Obr
Podminka

15.6.2017 9:34 / Ondřej Havlas
php,

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2017) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze