在 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表达式能让代码更易读时才用它。