引用下面的Demo。
1 | #[derive(Debug)] |
FnOnce
检查输出,可以发现在main函数退出后,e才销毁。1
2
3
4
5fn_once begins
fn_once calls: E { a: "fn_once" }
fn_once ended
main ended
destroyed struct E但如果使用
@2
处的代码,则输出如下。发现e被move到闭包里面去了,并且在闭包退出时就被销毁了。1
2
3
4
5fn_once begins
fn_once move calls: E { a: "fn_once" }
destroyed struct E
fn_once ended
main ended如果取消
@1
处的注释,那么编译报错。这也是符合闭包是FnOnce的认知的。Fn
不使用move版本1
2
3
4
5fn begins
fn calls: E { a: "fn" }
fn ended
main ended
destroyed struct E使用move版本
1
2
3
4
5fn begins
fn move calls: E { a: "fn" }
fn ended
destroyed struct E
main endedFnMut
将上面的代码简单改成FnMut,发现无论是move还是非move版本都无法编译,给出cannot borrow as mutable
错误。
需要改成mut func: F
才行。