přejít na obsah přejít na navigaci

Linux E X P R E S, Naučte se Ruby 7 - Pole

Naučte se Ruby 7 - Pole

ruby.jpg

Dnešní téma zní jednoduše - budeme se zabývat polem a ničím jiným. Co se ovšem pod pojmem "pole" vlastně rozumí, jak se s ním pracuje a jaké jsou jeho výhody? Pojďme se do toho pustit.


Pole si můžete představit jako řadu prvků spojených dohromady. Tyto prvky jsou uvozeny znakem hranaté závorky a odděleny čárkou. Polem je např.:

[]
[5]
['Ahoj', 'Na shledanou']

promenna = 'text'   # toto není pole, ale proměnná
[89.9, promenna, [true, false]]

První pole je prázdné, druhé obsahuje číslici 5, třetí pole obsahuje dva textové řetězce a konečně poslední pole obsahuje číslo, hodnotu proměnné promenna a posledním prvkem pole je pole obsahující pravdivostní hodnoty true a false.

Vzpomínáte na prázdný textový řetězec ('') ? Tak proč bychom nemohli mít prázdné pole ([]), že?

Pojďme se nyní podívat, jak se s jednotlivými prvky pole vlastně pracuje.

jmena = ['Martin', 'Honza', 'Alena']

puts jmena
puts
puts jmena[0]
puts jmena[1]
puts jmena[2]
puts jmena[3]

zobrazí

Martin
Honza
Alena

Martin
Honza
Alena
nil

K jednotlivým prvkům pole se tedy přistupuje prostřednictvím čísla (pozice) v poli. Jen je důležité pamatovat na to, že se jednotlivé prvky pole číslují od 0 a zároveň nás hodnota nil informuje o tom, že se v poli již žádný další prvek nenachází (v našem případě, že prvek pole s pořadovým číslem 3 neexistuje).

Hodnota nil je speciální objekt a znamená konec pole.

Metoda each

Metoda each vám umožní provést něco (cokoliv chcete) s každým prvkem pole. Zkusme následující příklad.

jazyky = ['čeština', 'angličtina', 'němčina']

jazyky.each do |jazyk|
   puts 'Můj nejoblíbenější jazyk je ' + jazyk + '!'
   puts 'Máte ho také rádi?'
end

zobrazí

Můj nejoblíbenější jazyk je čeština!
Máte ho také rádi?
Můj nejoblíbenější jazyk je angličtina!
Máte ho také rádi?
Můj nejoblíbenější jazyk je němčina!
Máte ho také rádi?

Je vidět, že se každá z hodnot pole jazyky v cyklu postupně dosadí do proměnné jazyk, kterou pak dál používáme pro výpis daného jazyka.

Podobně vypadá následující konstrukce, která nám umožní zopakovat nějaký kus kódu xkrát. Pozor, přitom se ale nejedná o pole, ale pouze metodu (objektu) celého čísla:

3.times do
  puts 'Mám tě rád.'
end

zobrazí

Mám tě rád.
Mám tě rád.
Mám tě rád.

Pokročilá práce s polem

Podívejme se nyní na další metody, které nám usnadní provádění většiny běžných operací, které někdy můžeme chtít s polem provést.

Metody join a to_s

potraviny = ['mléko', 'maso', 'pivo']

puts potraviny
puts
puts potraviny.to_s
puts
puts potraviny.join(', ')
puts
puts potraviny.join('  :)  ') + '  8)'

200.times do
  puts []
end

zobrazí

mléko
maso
pivo

mlékomasopivo

mléko, maso, pivo

mléko  :)  maso  :)  pivo  8)

Několik poznámek k předchozímu programu

  • puts potraviny vytiskne položky pole potraviny pod sebe
  • puts potraviny.to_s spojí položky pole dohromady, tedy je napíše jako jedno slovo
  • puts potraviny.join(', ') přidá ke každé položce pole text uvedený v závorce
  • puts potraviny.join(' :) ') + ' 8)' si můžete pro snadnější pochopení představit jako řetězec puts potraviny.join(' :) ') PLUS řetězec ' 8)'
  • konečně poslední cyklus neprovede nic, přesněji řečeno 200krát vypíše prázdné pole, tedy nevypíše nic

Metody push, pop, last, length

Zkusme tento příklad

oblibene = []

oblibene.push 'víno a brambůrky'
oblibene.push 'stránky Microsoftu'

puts oblibene[0]
puts oblibene.last
puts oblibene.length

puts oblibene.pop
puts oblibene
puts oblibene.length

zobrazí

víno a brambůrky
stránky Microsoftu
2
stránky Microsoftu
víno a brambůrky
1

a nyní vysvětlení

  • metoda push přidává do pole další položky, položky jsou přidávány postupně, jak přijdou, nová položka je přidána na konec pole
  • metoda last zobrazí poslední položku v poli
  • metoda length nám řekne, kolik prvků pole obsahuje (pozor, index posledního prvku v poli je o jedničku menší!)
  • metoda pop pak vrací položku z konce pole a zároveň ji z pole odebere

Pamatujte, že metody push a pop mění obsah pole. Metoda push prvky do pole přidává a metoda pop je odebírá!

Příklady 7

  • Napište program, který od nás bude na vstupu čekat neomezené množství slov (jedno slovo na řádek). Jakmile pak stisknete klávesu [Enter] na prázdném řádku, ukončí vstup slov a vypíše námi napsaná slova opačně, tzn. od posledního slova po první slovo, které jsme zadali.
  • Upravte předchozí příklad tak, že zadaná slova setřídíte, použijte metodu sort. Její syntaxe je snadná - pole.sort vrátí setříděný seznam prvků pole.
  • Přepište program, ve kterém jste vytvářeli obsah nějaké knihy. Jednotlivé kapitoly uchovejte jako prvky pole.
  • Napište program, který vytvoří pole 20 náhodných dvouciferných čísel. Zajistěte, aby se čísla uvedená v poli neopakovala!

Příště se podíváme na psaní vlastních metod. Jak sami uvidíte, usnadníme si tím psaní delších programů a zároveň zpřehledníme vlastní kód programu.

Nahoru

Příspěvky

Nil neznamená konec pole!
Pátek 10. 12. 2008, 14:29:23
Odpovědět  Odkaz 
"Hodnota nil je speciální objekt a znamená konec pole."

Nil sice je speciální objekt, ale neznamená konec pole, ale "nic" (tedy i konec pole, ale nil vrací třeba i gets, když je na konci souboru, apod.)

Vemte si třeba takovéto pole = [3, 4, nil, 5, 7]. Kdyby nil byl konec pole, tak pole[š] už by byl konec pole, což ale není, i když pole[2] opravdu vrátí nil.
Martin Šín Re:Nil neznamená konec pole!
Martin Šín 10. 12. 2008, 15:14:48
Odpovědět  Odkaz 
Váš příklad i poznámka je v pořádku a i když mi nezbývá než souhlasit, budu si dál trvat na svém. :-) Při zjišťování velikosti pole sice můžu použít length, které mi jeho délku vrátí, ale pokud bych ho zkoumal nějakým cyklem, pak budu zcela korektně předpokládat, že jakmile narazím na hodnotu nil, jsem na konci pole. Vložení nil doprostřed pole jsem ještě neviděl (ani by mě nenapadlo tohle provést), ale to bude tím, že nejsem programátor. :-)

Odpovědět

Nejsou podporovány žádné značky, komentáře jsou jen čistě textové. Více o diskuzích a pravidlech najdete v nápovědě.
Diskuzi můžete sledovat pomocí RSS kanálu rss



 
 

Top články z OpenOffice.cz