闭包/Lambda
匿名函数使用fun关键字定义
fun foo(f: fun(a:Int):Int) {
f(1)
}
foo(fun(a:Int):Int{
printf("%d\n", a)
return a + 1
})
暂不支持闭包的返回类型推断,需要显式指定返回类型。
捕获变量
默认通过值来捕获外部变量。
var i = 0
var f = fun(a:Int):Int{
return a + i
}
可变闭包
默认捕获的变量是不可变的
var i = 0
var f = fun(a:Int) mut {
i = 1
}
静态闭包
静态闭包指无状态的闭包,用static修饰。不可捕获变量。
var f : fun(a:Int) static : Int
引用捕获
不支持C++的引用捕获。如果想引用捕获,可以自己取地址。
var i = 0
var ri = &i
var f = fun(a:Int):Int{
return a + *ri
};
移动捕获
不支持C++的移动捕获。AutoMove用来包装对象,避免显式使用move指令:
var arr: DArray;
var autoMove = AutoMove { .set(arr) }
var f = fun() {
var s = autoMove.get().size()
}