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.
Egy osztályt a class kulcsszóval definiálunk, utána az osztály neve következik UpperCamelCase írásmóddal.
class Account
end
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)
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>
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
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
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
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
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
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.
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
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:
false-nak kell lennie, amikor a gépet bekapcsolják.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>
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>
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
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>
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>
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.