Kurzusok
/
Crystal
Crystal
/
Feladatok
/
Johannes gyümölcslé-készítője
Johannes gyümölcslé-készítője

Johannes gyümölcslé-készítője

Tanulófeladat

Bevezetés

Az osztályok központi fogalom az objektumorientált programozásban. A Crystalben minden objektum, minden objektumnak van típusa, és képes válaszolni bizonyos metódusokra. Az osztályok tervrajzok, amelyek alapján objektumokat hozunk létre: kezdőértéket adnak az állapotnak, például a változóknak, és megvalósítják a viselkedést, például a metódusokat. Az objektumok az osztályok példányai, amelyek tartalmazzák az összes példányváltozót és állapotot.

Az osztály definiálása

Egy osztályt a class kulcsszóval definiálunk, utána az osztály neve következik UpperCamelCase írásmóddal.

class Account
end

Példány létrehozása

Ha egy osztály példányát szeretnéd létrehozni, hívd meg az osztályon a new metódust.

class Account
end

account = Account.new

A fenti példában az account változó az Account osztály egy példánya.

Példány létrehozásakor egy initialize nevű speciális metódus működik konstruktorként. Ez akkor hívódik meg, amikor létrejön egy példány. A konstruktor segítségével beállíthatod a példány kezdőállapotát. Az initialize metódus fogadhat argumentumokat, amelyeket a példány létrehozásakor adsz át.

class Account
  def initialize(number)
    5 + number # => 9
  end
end

Account.new(4)
Note

Az initialize metódus nem adhat vissza értéket kézzel, helyette a new adja vissza az újonnan létrehozott példányt.

class Account
  def initialize(number)
    5 + number
  end
end

Account.new(4)
# => #<Account:0x7f5dc33dcea0>

Példánymetódusok

A példánymetódus olyan metódus, amely egy osztály példányán érhető el, és meghívható azon a példányon. A példánymetódusokat a def kulcsszóval definiáljuk, utána a metódus neve következik. Az osztálydefiníción belül definiáljuk őket.

class Account
  def balance
    100
  end
end

account = Account.new
account.balance # => 100

Példányváltozók

A példányváltozók olyan változók, amelyek a példány minden metódusában elérhetők. Egy példányváltozó eléréséhez példánymetódust kell definiálnod. Kezdőértéket az initialize metódusban adhatsz nekik. A @ előtaggal definiáljuk őket.

class Account
  def initialize
    @balance = 100
  end

  def balance
    @balance
  end
end

account = Account.new
account.balance
# => 100

A példányváltozókat az osztálydefiníción belül is definiálhatod.

class Account
  @age = 0
end

Példányváltozók kezdőértékkel

A példányváltozóknak kezdőértéket adhatsz az initialize metódusnak átadott argumentummal. Mivel a Crystal nem tudja kikövetkeztetni a példányosításkor használt argumentum típusát, ezért meg kell adnod azt. Ha többet szeretnél erről olvasni: típuskövetkeztetés. A változó típusának megadásához használd a : jelet, utána a típust. Ha például egy balance nevű, Int32 típusú példányváltozót szeretnél létrehozni, ezt így teheted: @balance : Int32. Vagy ha egy raining nevű, Bool típusú példányváltozót szeretnél létrehozni: @raining : Bool.

Többféleképpen is megvalósíthatod: az initialize metódusban megadhatod az argumentum típusát, majd hozzárendelheted a példányváltozót az argumentumhoz, ahogy az alábbi példában:

class Account
  def initialize(balance : Int32)
    @balance = balance
  end

  def balance
    @balance
  end
end

account = Account.new(1)
account_2 = Account.new(5)

account.balance
# => 1

account_2.balance
# => 5

Egy másik módszer, ha a példányváltozó típusát az osztálydefinícióban adod meg @<variable> : <Type> formában, ahogy az alábbi példában:

class Weather

  @raining : Bool

  def initialize(raining)
    @raining = raining
  end

  def raining
    @raining
  end
end

weather = Weather.new(true)
weather.raining
# => true

Példányváltozók módosítása

A metódusok módosíthatják a példányváltozókat. Ezeket a metódusokat az osztály példányán hívhatod meg. Amikor egy metódus módosít egy példányváltozót, a változás csak abban az osztálypéldányban lesz látható, amelyen meghívtad.

class Account
  def initialize(balance : Int32)
    @balance = balance
  end

  def withdraw(amount)
    @balance -= amount
  end

  def balance
    @balance
  end
end

account = Account.new(10)
account_2 = Account.new(10)
account.balance
# => 10

account_2.balance
# => 10

account.withdraw(5)
account.balance
# => 5

account_2.balance
# => 10

Osztálymetódusok

Az osztálymetódusok olyan metódusok, amelyeket egy osztályhoz definiálunk, nem pedig a példányaihoz. Segítségükkel olyan metódusokat hozhatsz létre, amelyek nem függnek a példány állapotától. A def kulcsszóval definiáljuk őket, utána a self.<method name> következik. A self arra a névtérre hivatkozik, ahonnan éppen meghívják. Ebben az esetben az osztályra, az Account-ra utal. Ugyanaz lenne, mintha Account.-ot írtál volna, de a self. az ajánlott megoldás.

class Account
  def self.balance
    100
  end
end

Account.balance
# => 100

Utasítások

A barátod, Johannes imád barkácsolni, vagyis saját kezűleg hardvereket építeni. Épp most épített egy lékészítőt, és Johannes nagyon izgatott miatta. Johannes célja, hogy minden reggel friss levet tudjon készíteni.

A Johannes-féle lékészítő rengeteg szuper funkcióval rendelkezik. Például egy beépített mérőrendszerrel, amely megmondja, mennyi lé van a pohárban. Van egy időzítője is, amely megmutatja, mióta jár a gép.

Johannes nem a legjobb programozó, de szeretne egy programot írni, amellyel vezérelheti a gépet. Ezért megkért téged, hogy segíts neki.

1. Debug lámpa

A gépen van egy debug lámpa. Ez egy egyszerű mechanizmus: ha a gép áram alatt van, a debug lámpa világít. A program csak akkor fut, ha a debug lámpa világít.

Ez a metódus a JuiceMaker osztály egy osztálymetódusa kell legyen.

Definiáld a JuiceMaker.debug_light_on? osztálymetódust, amely true-t ad vissza.

JuiceMaker.debug_light_on?
#=> true

2. A gép inicializálása

Amikor a gépet bekapcsolják, létre kell hoznia a JuiceMaker osztály egy példányát. A gépnek rendelkeznie kell egy inicializált állapottal. Az inicializált állapotnak a következő adatokat kell tárolnia:

  1. Hogy a gép jár-e vagy sem. Ennek mindig false-nak kell lennie, amikor a gépet bekapcsolják.
  2. A pohárban lévő lé mennyisége. Ez egy érzékelő lesz, amely megméri a pohárban lévő lé mennyiségét.

Definiáld az inicializált állapotot, amely paraméterként a pohárban lévő lé mennyiségét veszi át, és hozd létre az inicializált állapotot. Az inicializált állapotnak tartalmaznia kell egy @running példányváltozót, amely false értékre van állítva, és egy @fluid példányváltozót, amely az osztály inicializálásakor átadott argumentumon alapul.

JuiceMaker.new(5)
#=> #<JuiceMaker:0x10f0b8 @running=false, @fluid=5>

3. A gép bekapcsolása

A gép be- és kikapcsolható. Definiálnod kell egy metódust a gép bekapcsolásához. Amikor a gépet bekapcsolják, a futási állapotot true-ra kell állítani.

Definiáld a JuiceMaker#start metódust, amely bekapcsolja a gépet.

juice_maker = JuiceMaker.new(5)
juice_maker.start

juice_maker
#=> #<JuiceMaker:0x10f0b8 @running=true, @fluid=5>

4. A gép állapota

A gépnek meg kell tudnia mondani, milyen állapotban van. true-t kell visszaadnia, ha a gép jár, és false-t, ha a gép nem jár.

Definiáld a JuiceMaker#running? metódust, amely visszaadja a gép állapotát.

juice_maker = JuiceMaker.new(5)
juice_maker.start

juice_maker.running?
#=> true

5. Lé hozzáadása

A gép levet tud hozzáadni a pohárhoz. A gép meg tudja mondani, mennyi lé került a pohárba. A gépnek segítségre van szüksége ahhoz, hogy tudja, mennyi lé van a pohárban, miután a levet hozzáadták.

Definiáld a JuiceMaker#add_fluid metódust, amely paraméterként a hozzáadott lé mennyiségét veszi át, és frissíti a pohárban lévő lé mennyiségét.

juice_maker = JuiceMaker.new(5)
juice_maker.add_fluid(5)

juice_maker
#=> #<JuiceMaker:0x10f0b8 @running=false, @fluid=10>

6. A gép kikapcsolása

A gép be- és kikapcsolható. Definiálnod kell egy metódust a gép kikapcsolásához. Ezt a metódust csak akkor hívják meg, amikor a gép jár. Amikor a gépet kikapcsolják, a futási állapotot false-ra kell állítani. A gépnek abban is segítségre van szüksége, hogy meghatározza, mennyi lé van a pohárban, miután kikapcsolták. A gép percenként öt egység levet használ fel.

Definiáld a JuiceMaker#stop metódust, amely paraméterként megkapja, hány percig járt a gép, és visszaadja a pohárban lévő lé mennyiségét, miután a gépet kikapcsolták.

juice_maker = JuiceMaker.new(5)

juice_maker.start
juice_maker
#=> <JuiceMaker:0x10f0b8 @running=true, @fluid=5>

juice_maker.stop(1)
#=> #<JuiceMaker:0x10f0b8 @running=false, @fluid=0>
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Crystal Exercism

Készen állsz elkezdeni a(z) Johannes gyümölcslé-készítője feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Crystal nyelvet 26 fogalom142 feladat segítségével, valódi emberi mentorálással, mindez ingyen.