Objektem může být cokoliv, auto, dům, člověk, počítač, robot, svět… Zde se fantazii meze nekladou. Třída pak zastřešuje skupinu objektů stejných vlastností (např. všechna auta mají motor, kapotu, určitou spotřebu, atd.).
Nejprve se seznamme s několika třídami, které jsou v ruby definovány. Základní metodou v podstatě každé třídy je metoda new, která vytvoří nový objekt dané třídy. Ukažme si to na následujícím příkladu:
a = Array.new + [12345] b = String.new + 'Ahoj' c = Time.new puts 'a = ' + a.to_s puts 'b = ' + b.to_s puts 'c = ' + c.to_s
zobrazí
a = 12345 b = Ahoj c = Wed Jun 11 13:36:17 +0200 2008
A co jsme to vlastně vytvořili?
- Objekt
pole(Array) a pak do něj přidali jednu položku. - Objekt
řetězec(String) a přidali do něj text. - Objekt
čas(Time), který se automaticky inicializoval aktuální informací o času a datu dle nastavení počítače.
Umět říct, kolik je hodin, patří bezesporu mezi základní dovednosti žáků základní školy. Pokud umíte s časem i pracovat, můžete nějaký také ušetřit. Podívejme se tedy na třídu Time zblízka.
Třída čas
Zkusme několik základních příkladů. S časem je možno počítat:
cas = Time.new cas2 = cas + 60 # o minutu déle puts cas puts cas2
zobrazí
Wed Jun 11 14:06:03 +0200 2008 Wed Jun 11 14:07:03 +0200 2008
Čas můžete pomocí metody mktime nastavit na vámi zvolenou hodnotu.
puts Time.mktime(2000,1,1) puts Time.mktime(1970, 2, 1, 10, 0)
zobrazí
Sat Jan 01 00:00:00 +0100 2000 Fri Jan 02 10:00:00 +0100 1970
Čas lze také porovnávat s jiným časem a určit, který čas je starší nebo naopak novější. Konečně, časy můžete mezi sebou odečítat a určit tak kolik doby (sekund) od té doby uteklo.
Třída Hash
O třídě Hash jsme dosud nemluvili, patří však mezi třídy, o kterých bychom měli vědět. Hash se podobá poli, ale oproti němu nejsou položky uspořádány lineárně za sebou (nejsou vzestupně očíslovány počínaje 0). Hash se hodí především pro neuspořádanou skupinu prvků.
Neuspořádaná skupina prvků je taková skupina prvků, ve které nezáleží na pořadí.
poleBarev = [] # to samé jako metoda Array.new
hashBarev = {} # to samé jako metoda Hash.new
poleBarev[0] = 'červeně'
poleBarev[1] = 'zeleně'
poleBarev[2] = 'modře'
hashBarev['text'] = 'červeně'
hashBarev['čísla'] = 'zeleně'
hashBarev['klíčová slova'] = 'modře'
poleBarev.each do |barva|
puts barva
end
puts
hashBarev.each do |vyuziti, barva|
puts vyuziti + ': ' + barva
end
zobrazí
červeně zeleně modře text: červeně čísla: zeleně klíčová slova: modře
V hashi je každý prvek označen nějakým symbolem, v našem případě jím je slovo, ale mohl by to být také znak nebo číslice.
Rozšíření třídy
V předchozí kapitole jsme měli příklad, který vyslovil číslo tak, jak se čte. Zkusme nyní něco podobného, ale s tím rozdílem, že rozšíříme stávající třídu celých čísel (Integer) o další metodu, kterou nazveme např. to_czech (do_cestiny). (Celý příklad si pro jednoduchost zápisu velmi zjednodušíme. ;-))
class Integer
def to_czech
if self == 5
cesky = 'pet'
else
cesky = 'padesatpet'
end
cesky
end
end
puts 5.to_czech
puts 55.to_czech
zobrazí
pet padesatpet
Pro označení objektu jsme použili jeho identifikátor v podobě klíčového slova self. Tato proměnná se vždy odkazuje na sebe sama, tedy objekt, ve kterém se nacházíme.
Vytváření tříd
Zatím jsme třídy jenom používali či rozšiřovali. Pojďme se podívat, jak třídu vytvořit, jak vlastně vzniká. Zkusme následující jednoduchou třídu.
class Kostka
def hod
1 + rand(5)
end
end
hody_kostkou = [Kostka.new, Kostka.new, Kostka.new]
hody_kostkou.each do |kostka|
puts kostka.hod
end
zobrazí např.
5 5 1
Třída je uvozena klíčovým slovem class. Dál v ní můžete vytvářet její vlastní metody pomocí klíčového slova def.
Proměnné instancí
Instance je terminus technicus, který není ničím jiným než konkrétním objektem dané třídy, tzn. objektem, se kterým pracujeme a který má vlastnosti nějaké třídy.
Proměnné instancí jsou dostupné v celé třídě. Abychom je odlišili od lokálních proměnných, začínají znakem zavináč @.
class Kostka
def hod
@cislo = 1 + rand(5)
end
def vysledek
@cislo
end
end
kostka = Kostka.new
kostka.hod
puts kostka.vysledek
puts kostka.vysledek
kostka.hod
puts kostka.vysledek
puts kostka.vysledek
zobrazí
2 2 3 3
Celý proces házení kostkou bychom si pak mohli zjednodušit využitím metody initialize, která se při vytvoření daného objektu provede automaticky.
class Kostka
def initialize
hod
end
def hod
@cislo = 1 + rand(5)
end
def vysledek
@cislo
end
end
puts Kostka.new.vysledek
puts Kostka.new.vysledek
tento příklad zobrazí např. toto:
5 4
Pokud bychom nyní chtěli uživateli zamezit v tom, aby mohl s kostkou házet, tzn. aby se kostka inicializovalo pouze při svém vytvoření, můžeme metodu hod označit jako soukromou (private). Tím zajistíme, že k této metodě nebude možno přistupovat zvenku.
class Kostka
def initialize
hod
end
def vysledek
@cislo
end
private
def hod
@cislo = 1 + rand(5)
end
end
kostka = Kostka.new.vysledek
puts kostka
kostka.hod
zobrazí
4 promenne_trid3.rb:21: undefined method `hod' for 4:Fixnum (NoMethodError)
Tedy třída Kostka metodu hod nezná!
Pozor: cokoliv uvedete za slovem private, bude soukromé pro danou třídu!
Příklady 9
- Zjistěte, kolik vám bude za bilión sekund od vašeho narození. (Pro provedení výpočtu si zkuste zjistit, v kolik hodin jste se narodili.)
- Napište program, který se vás zeptá, kdy jste se narodili, z tohoto data vypočítá, kolik vám je let a dodatečně vám popřeje za každý den vašich narozenin, který jste již měli.
- Napište program - simulátor automobilu s děravou nádrží, kterému na začátku zadáte požadovanou vzdálenost a automobil si bude sám sledovat stav své nádrže a v případě potřeby natankuje benzín. (Pro stanovení dojezdu automobilu na plnou nádrž použijte nějakou vámi předem danou hodnotu v kilometrech plus určitou vzdálenost, která není předem známa a jejíž výpočet necháte na funkci
rand.) Použijte třídy!
Příště nás čeká poslední díl našeho seriálu, pro zachování určité nádechu tajemna si pouze řekněme, že se bude jmenovat "Bloky a Proc". Co to znamená a jak to spolu souvisí, se dozvíte již příště.







