Az Elixirben a tuple egy olyan adatszerkezet, amely adatokat rendez el, rögzített számú, bármilyen típusú elemet tartalmaz, de az egyes elemeknek nincs kifejezett nevük. A tuple-öket az Elixirben gyakran használják memóriaolvasás-igényes műveletekhez, mert egy elem kiolvasása konstans idejű művelet. Általában nem használjuk őket olyankor, amikor elemeket dinamikusan kell hozzáadni vagy eltávolítani, mert a meglévő tuple módosítása helyett új tuple jön létre, amihez előre memóriát kell lefoglalni.
A gyakorlatban az Elixirben kapcsos zárójelekkel hozunk létre tuple-t. Egy tuple elemei egyenként elérhetők az elem/2 függvénnyel, nulla alapú indexeléssel:
empty_tuple = {}
one_element_tuple = {1}
multiple_element_tuple = {1, :a, "hello"}
elem(multiple_element_tuple, 2)
# => "hello"
A tuple-öket a gyakorlatban gyakran csoportosított információ ábrázolására használják.
Float.ratio(0.25)
# => {1, 4} indicating the numerator and denominator of the fraction ¼
A mintaillesztés használata meghatározó az Elixir magabiztos, idiomatikus kódjában. Talán emlékszel rá, hogy a =/2 operátort inkább illesztő operátorként, mintsem értékadó operátorként írják le. Amikor az illesztő operátort használod, és a bal oldali minta illeszkedik a jobb oldalra, akkor a bal oldalon lévő változók értéket kapnak, a kifejezés értéke pedig a jobb oldal értéke lesz. Ha nincs egyezés, MatchError kivétel keletkezik.
2 = 2
# => 2
# Literals can be matched if they are the same
2 = 3
# => ** (MatchError) no match of right hand side value: 3
{_, denominator} = Float.ratio(0.25)
# => {1, 4}
# the variable `denominator` is bound to the value 4
Ne feledd, az illesztés jobbról balra történik.
Az utolsó példában, ha nincs szükségünk egy változóra a mintaillesztésben, akkor a _-ra hivatkozva eldobhatjuk. A futtatókörnyezet nem követi nyomon azokat a változókat, amelyek _-tal kezdődnek.
A mintaillesztés akkor is hasznos eszköz, amikor több függvényklauzulát hozunk létre. A mintaillesztést a függvények argumentumain is használhatjuk, ami meghatározza, hogy melyik függvényklauzula hívódik meg, a fájl tetejétől lefelé haladva az első egyezésig. A változók a függvényfejben kötődhetnek, és a függvénytörzsben használhatók.
defmodule Example do
def named_function(:a = variable_a) do
{variable_a, 1}
end
def named_function(:b = variable_b) do
{variable_b, 2}
end
end
Example.named_function(:a)
# => {:a, 1}
Example.named_function(:b)
# => {:b, 2}
Example.named_function(:c)
# => ** (FunctionClauseError) no function clause matching in Example.named_function/1
Amikor épp sütiket készülsz sütni a barátaidnak, rájössz, hogy a receptben szereplő mérések egy részét át kell váltanod. Mivel csak a metrikus rendszert ismered, ki kell találnod egy módot arra, hogy a gyakori amerikai konyhai mértékegységeket milliliterre (mL) váltsd a saját kényelmed érdekében.
Használd ezt az átváltási táblázatot a megoldásodhoz:
| Átváltandó mértékegység | térfogat | milliliterben (mL) |
|---|---|---|
| mL | 1 | 1 |
| amerikai csésze | 1 | 240 |
| amerikai folyadék uncia | 1 | 30 |
| amerikai teáskanál | 1 | 5 |
| amerikai evőkanál | 1 | 15 |
Mivel tehetséges programozópalánta vagy, úgy döntesz, hogy a millilitert használod átmeneti mértékegységként, hogy megkönnyítsd bármely felsorolt mértékegység átváltását bármely másikra (még önmagára is).
Valósítsd meg a KitchenCalculator.get_volume/1 függvényt. Egy térfogatpár tuple esetén csak a numerikus komponenst adja vissza.
KitchenCalculator.get_volume({:cup, 2.0})
# => 2.0
Valósítsd meg a KitchenCalculator.to_milliliter/1 függvényt. Egy térfogatpár tuple esetén az átváltási táblázat segítségével milliliterre kell váltania a térfogatot.
Használj több függvényklózt és mintaillesztést az egyes mértékegységekhez tartozó függvények létrehozásához. Az egyes mértékegységeket jelölő atomok: :cup, :fluid_ounce, :teaspoon, :tablespoon, :milliliter. Az átváltás eredményét tuple-be csomagolva add vissza.
KitchenCalculator.to_milliliter({:cup, 2.5})
# => {:milliliter, 600.0}
Valósítsd meg a KitchenCalculator.from_milliliter/2 függvényt. Egy térfogatpár tuple és a kívánt mértékegység esetén az átváltási táblázat segítségével a kívánt mértékegységre kell váltania a térfogatot.
Használj több függvényklózt és mintaillesztést az egyes mértékegységekhez tartozó függvények létrehozásához. Az egyes mértékegységeket jelölő atomok: :cup, :fluid_ounce, :teaspoon, :tablespoon, :milliliter
KitchenCalculator.from_milliliter({:milliliter, 1320.0}, :cup)
# => {:cup, 5.5}
Valósítsd meg a KitchenCalculator.convert/2 függvényt. Egy térfogatpár tuple és a kívánt mértékegység esetén a megadott térfogatot a kívánt mértékegységre kell váltania.
KitchenCalculator.convert({:teaspoon, 9.0}, :tablespoon)
# => {:tablespoon, 3.0}
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Elixir nyelvet 58 fogalom168 feladat segítségével, valódi emberi mentorálással, mindez ingyen.