use kifejezések használataGleamben gyakori, hogy magasabb rendű függvényeket írunk és használunk, vagyis olyan függvényeket, amelyek más függvényeket fogadnak argumentumként. Előfordul, hogy amikor egyszerre sok magasabb rendű függvényt használunk, a kód a sok behúzási szint miatt nehezen olvashatóvá válik.
Például itt van egy függvény, amely több olyan függvényt hív meg, amelyek Result(Int, Nil) értéket adnak vissza, és összegzi az értékeket, ha mind a négy sikeres.
import gleam/result
pub fn main() -> Result(Int, Nil) {
result.try(function1(), fn(a) {
result.try(function2(), fn(b) {
result.try(function3(), fn(c) {
result.try(function4(), fn(d) {
Ok(a + b + c + d)
})
})
})
})
}
A Gleam use kifejezéseivel ezt a kódot behúzás nélkül is leírhatjuk, ami gyakran olvashatóbbá teszi.
import gleam/result
pub fn main() -> Result(Int, Nil) {
use a <- result.try(function1())
use b <- result.try(function2())
use c <- result.try(function3())
use d <- result.try(function4())
Ok(a + b + c + d)
}
A use kifejezés összegyűjti a blokkban utána következő összes utasítást, és azokat callback függvényként adja át a függvényhívás utolsó argumentumaként. A use kulcsszó és a <- szimbólum között álló változók azoknak az argumentumoknak a nevei, amelyeket a callback függvény meg fog kapni.
// This use expression
use a <- function(1, 2)
io.println("Hello!")
a
// Is equivalent to this normal function call
function(1, 2, fn(a) {
io.println("Hello!")
a
})
A callback függvény tetszőleges számú argumentumot kaphat, de akár egyet sem.
use a, b, c, d <- call_4_function()
use <- call_0_function()
Nincs különösebb követelmény az olyan függvények létrehozásához, amelyeket use kifejezéssel lehet meghívni, azon kívül, hogy utolsó argumentumként egy callback függvényt fogadnak.
pub fn call_twice(function: fn() -> t) -> #(t, t) {
let first = function()
let second = function()
#(first, second)
}
A Gleam use kifejezései nagyon hatékony lehetőséget kínálnak, és sok problémára alkalmazhatók, de ha túl sokat használjuk őket, nehezen olvashatóvá tehetik a kódot. Általában jobb a szokásos függvényhívási szintaxist használni, és csak akkor nyúlni a use kifejezésekhez, amikor olvashatóbbá teszik a kódot.
Daphne egy rendszert fejlesztett, amellyel a kísérleteit futtatja és rögzíti azok eredményeit. A kód egy része kicsit bőbeszédűvé és ismétlődővé vált, ezért megkért, hogy írj néhány use kifejezést, amelyek segítenek letisztázni.
with_retry függvénytNéha egy kísérlet egy egyszeri hiba miatt elbukhat, ezért ha egy kísérlet sikertelen, Daphne szeretné újra megpróbálni, hogy lássa, másodszorra sikerül-e.
Definiáld a with_retry függvényt, amely argumentumként egy eredményt visszaadó függvényt kap.
Ha a függvény Ok értéket ad vissza, akkor a with_retry is azt az értéket adja vissza.
Ha a függvény Error értéket ad vissza, akkor a with_retry újra meghívja a függvényt, és annak a hívásnak az eredményét adja vissza.
Daphne így fogja használni a függvényt:
pub fn main() {
use <- with_retry
// Perform the experiment here
}
record_timing függvénytDaphne úgy rögzíti, hogy mennyi ideig tart az egyes kísérletek futtatása, hogy minden kísérlet előtt és után meghív egy időnaplózó függvényt.
Definiáld a record_timing függvényt, amely két argumentumot kap:
Nil-t ad vissza.A record_timing először meghívja az időnaplózó függvényt, majd a kísérletfüggvényt, aztán ismét az időnaplózó függvényt, végül pedig visszaadja a kísérletfüggvény eredményét.
Daphne így fogja használni a függvényt:
pub fn main() {
use <- record_timing(time_logger)
// Perform the experiment here
}
run_experiment függvénytA kísérletek három fázisból állnak: az előkészítésből, a végrehajtásból és a rögzítésből. Mindhárom fázis eredményt ad vissza, és mindegyik fázisnak szüksége van az előző fázis sikeres eredményére ahhoz, hogy lefusson.
Definiáld a run_experiment függvényt, amely négy argumentumot kap:
String-ként.Ok értékét kapja, és egy eredményt ad vissza.Ok értékét kapja, és egy eredményt ad vissza.Ha mindhárom függvény sikeresen lefut, akkor a run_experiment a Ok(#(experiment_name, recording_data)) értéket adja vissza.
Ha bármelyik függvény Error értéket ad vissza, akkor a run_experiment azt az értéket adja vissza.
Daphne így fogja használni a függvényt:
pub fn main() {
use setup_data, action_data <- run_experiment("Test 1", setup, action)
// Record the results here
}
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Gleam nyelvet 33 fogalom122 feladat segítségével, valódi emberi mentorálással, mindez ingyen.