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ě.