在看 B 站上的教程,看到关于 move 和 闭包的东西。 地址是 https://b23.tv/dXol75P
其实中说 FnOne 是至少调用一次。
还有 Rust 圣经中也同样这么说。 内容如下:
所有的闭包都自动实现了 FnOnce 特征,因此任何一个闭包都至少可以被调用一次
但 Kimi 的解释是:
FnOnce 的设计目标是确保闭包在调用时可以安全地消耗变量的所有权,而不是强制要求闭包必须被调用。换句话说:
“只能调用一次”:闭包被设计为只能调用一次,以避免多次调用导致的错误。
“至少调用一次”:这不是 FnOnce 的要求。闭包可以选择不被调用,但一旦调用,就不能再次调用。
大致意思就是“只能调用一次”
我的理解也是只能调用一次。
ps: 前几天看到有个推荐 Rust 教程的页面,说《 Rust 语言圣经》错误太多。我现在找不到出处了。请问有哪些是错误的?
1
PTLin 5 天前
调用 FnOnce 闭包其实展开是这样
```rust #![feature(impl_trait_in_bindings)] #![feature(fn_traits)] use std::ops::FnOnce; fn main(){ let a:impl FnOnce()=||{}; a.call_once(()); } ``` call_once(self, args: Args),签名是这样,第一个参数会消耗闭包的所有权,但是有些情况闭包的匿名结构体会被实现 Copy ,这时候即使是 FnOnce 也可以多次被调用。 |
2
nebkad 3 天前
在实际效果上,FnOnce 最多被调用一次。
在抽象意义上,FnOnce 是 FnMut 和 Fn 的超集,因为 FnMut 和 Fn 总是可以理解为消耗一个 &mut Self 和 &Self 来完成一次调用,而 &mut Self 和 &Self 可以视为 Clone 的(不同的 &mut Self 必然有 lifetime 的区别但也算是可 Clone) 这个逻辑不是那么直观,但还算自洽 |