在 Gleam 裡,撰寫並使用高階函式是很常見的事,也就是說,這種函式會把其他函式當作引數。有時候同時使用許多高階函式,程式碼會變得難以閱讀,因為會出現很多層縮排。
例如,這裡有一個函式,它呼叫了幾個回傳 Result(Int, Nil) 的函式,並在四個都成功時把這些值加總起來。
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)
})
})
})
})
}
Gleam 的 use 運算式讓我們不用縮排就能寫出這段程式碼,通常也讓程式碼更容易閱讀。
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)
}
use 運算式會收集程式區塊中後續的所有敘述,並把它們當作回呼函式,作為最後一個引數傳給該函式呼叫。介於 use 關鍵字與 <- 符號之間的變數,就是將傳給回呼函式的引數名稱。
// 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
})
回呼函式可以接受任意數量的引數,也可以完全不接受。
use a, b, c, d <- call_4_function()
use <- call_0_function()
要建立一個能用 use 運算式呼叫的函式,並沒有什麼特別的要求,只要把回呼函式當作最後一個引數就好。
pub fn call_twice(function: fn() -> t) -> #(t, t) {
let first = function()
let second = function()
#(first, second)
}
Gleam 的 use 運算式是非常強大的功能,可以運用在許多問題上,但用得太過火時,反而會讓程式碼難以閱讀。一般來說,最好還是使用一般的函式呼叫語法,只有在 use 運算式能讓程式碼更容易閱讀時才用它。