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

Linux E X P R E S, Naučte se Ruby 9 - Třídy

Naučte se Ruby 9 - Třídy

ruby.jpg

Musím se přiznat, že práce s objekty a třídami těchto objektů patří mezi mé neoblíbenější činnosti. Třídy vám umožní vytvořit si svůj vlastní objekt a ten dál používat, vylepšovat, prostě s ním pracovat. S třídami, aniž bychom si to uvědomili, jsme se setkali už mnohem dříve a dnes se na ně podíváme podrobněji.


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

Nahoru

Přidat téma diskuse

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