Mérleg

Mérleg

Tanulófeladat

Bevezetés

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.

Getters

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

Setters

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

Property

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

Utasítások

Ebben a feladatban egy mérleget fogsz modellezni.

1. Hozd létre a mérleg kezdeti állapotát

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)

2. Tedd lehetővé, hogy a mérlegnek pontossága legyen

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

3. Tedd lehetővé, hogy a mérlegen beállítható legyen a súly

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

4. Tedd lehetővé, hogy a gép váltson a metrikus és az angolszász mértékegységek között

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
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Crystal Exercism

Készen állsz elkezdeni a(z) Mérleg 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.