函数和闭包
原创大约 1 分钟
函数
函数是Aviator中的一等公民,可以通过fn
来定义函数。
fn add(x, y) {
## 这里也可以写成x + y,不加分号;,这种方式也可以返回值
return x + y;
}
res = add(1, 2);
println(res);
res = add("hello", " aviator");
println(res);
## 函数也可以通过参数个数进行重写
fn add(x, y, z) {
x + y + z
}
println(add(1, 2, 3));
Aviator也支持函数的变长参数。
## 通过&定义变长参数,但是第一参数不能省略,而且不能用&
fn add(param, &args) {
let res = "";
for arg in args {
res = res + param + arg;
}
return res;
}
println(add("", "a", "b"));
println(add("", "a", "b", "c", "d"));
## 定义一个参数解包函数
fn unpack(a, b, c, d) {
a * b + c * d
}
a = tuple(1, 2);
list = seq.list(3, 4);
## 如果没有参数解包功能,就必须这样传参:unpack(a[0], a[1], list[0], list[1])
## 通过参数解包,可以这样传参:unpack(*a, *list)
println(unpack(*a, *list));
闭包
Aviator中的所谓闭包
(Closure
),就是一段被封装的lambda表达式
代码。
## 如果没有外层lambda(),c2执行时就会受c1的结果干扰
## 如果没有内层lambda(),就做不了累加计算
## 两个lambda()表达式共同组成了闭包
let counter = lambda() ->
let c = 0;
lambda() ->
let result = c;
c = c + 1;
return result;
end
end;
c1 = counter();
c2 = counter();
println("test c1...");
for i in range(0, 10) {
print(c1() + "\t");
}
println();
println("test c2...");
for i in range(0, 10) {
print(c2() + "\t");
}
感谢支持
更多内容,请移步《超级个体》。