A getter és a setter olyan metódusok, amelyekkel egy objektum tulajdonságának értékét olvashatod és írhatod. A Crystal rendelkezik makrókkal, így könnyen definiálhatsz gettert és settert egy tulajdonsághoz. A makrók segítségével fordítási időben generálhatsz kódot, amiről később, a makró fogalomnál lesz szó.
A Rubyben ezeket a metódusokat az attr_reader, az attr_writer és az attr_accessor metódussal definiálod, és felületesen nézve nagyon hasonlítanak a Crystal megvalósításához.
A Crystal ezeket getter, setter és property makróként definiálta.
A getter egy olyan makró, amely egy példányváltozó értékét visszaadó metódust definiál.
Ez azt jelenti, hogy ha hozzá akarsz férni a példányváltozóhoz, már nem kell @-ot írnod elé (metódusokban, az initialize kivételével); helyette meghívhatod azt a metódust, amelyet a getter makró definiált.
A getter makró több példányváltozót is elfogad, amelyeket vesszővel választasz el egymástól.
# This:
class Person
@name : String
@age : Int32
def name
@name
end
def age
@age
end
end
# Is the same as this:
class Person
@name : String
@age : Int32
getter name, :age
end
Amint látod, a getter használatával kevesebb kódot írsz, és a kód olvashatóbb lesz. A Ruby és a Crystal abban is különbözik, hogy a Crystal a getter makrónak argumentumként elfogadja a változónevet és a szimbólumot is. A szimbólumokról később, a szimbólum fogalomnál lesz szó.
A setter egy olyan makró, amely egy példányváltozó értékét beállító metódust definiál.
Ez a makró nem túl gyakori, helyette általában a property makrót használjuk.
A létrejövő metódusok így néznek ki: name_of_method=; az = teszi lehetővé, hogy a tulajdonságot be lehessen állítani.
Ez a metódusdefiníció kicsit különleges, mert a metódus által kapott argumentum az = jel után van.
A Crystalben több más különleges metódus is ezt a szintaxist használja, például a + metódus.
A getter makróhoz hasonlóan, miután definiáltál egy settert, a példányváltozó értékének frissítéséhez meghívhatod azt a metódust, amelyet a setter makró definiált.
# This:
class Person
@name : String
@age : Int32
def name=(name : String)
@name = name
end
def age=(age : Int32)
@age = age
end
end
# Is the same as this:
class Person
@name : String
@age : Int32
setter name, :age
end
A property egy olyan makró, amely egy példányváltozóhoz gettert és settert is definiál.
class Person
@name : String
@age : Int32
property name, :age
end
Ebben a feladatban egy mérleget fogsz modellezni.
Inicializáláskor a mérlegnek a gyári beállításaira kell támaszkodnia, amelyek attól függően térnek el, hogy hol árulják a gépet. Ennek megfelelően a mérleget egy pontossággal lehet inicializálni, valamint azzal, hogy metrikus vagy angolszász mértékegységrendszert használ.
Valósítsd meg a WeighingMachine#initialize metódust, amely két argumentumot vár: a precision nevűt, ami egy Int32, és a metric nevűt, ami egy Bool.
A metric argumentum true értéke azt jelenti, hogy a mérlegnek a metrikus rendszert kell használnia, egyébként az angolszász rendszert.
Az initialize metódusnak emellett a @weight példányváltozót is 0.0-ra kell állítania.
precision = 3
metric = true
vm = WeighingMachine.new(precision, metric)
Hogy a különböző igényeket kiszolgáljuk, minden mérleget testre szabhatunk egy pontossággal (a tizedesjel utáni számjegyek számával).
Valósítsd meg a WeighingMachine#precision getter metódust, amely visszaadja a mérleg pontosságát.
precision = 3
metric = true
vm = WeighingMachine.new(precision, metric)
vm.precision
# => 3
Valósítsd meg a WeighingMachine#weight tulajdonságot, hogy a súlyt le lehessen kérdezni és be is lehessen állítani:
precision = 3
metric = true
wm = WeighingMachine.new(precision, metric)
wm.weight = 60.5
wm.weight
# => 60.5
wm.weigh
# => 60.5
Valósítsd meg a WeighingMachine#metric= tulajdonságot, hogy a mértékegységet be lehessen állítani.
Boolean értéket kell elfogadnia.
precision = 3
metric = true
wm = WeighingMachine.new(precision, metric)
vm.weight = 60.5
wm.metric = false
vm.weigh
# => 133.377
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.