闭合参数:传递一个突变内部变量的函数
这个想法是要捕获状态(在这种情况下为 x
),将一个函数作为其参数( alterer
,在这种情况下为 canse_x
) /code>),这将决定 内在状态如何变化。
pub fn plus17(h: & u64) -> u64 {
*h + 17
}
pub fn main() {
let x = 0; //take x by reference
let mut change_x = move |alterer: &dyn FnOnce(&u64) ->u64 | alterer(&x) ;
change_x(&mut plus17);
println!("{}", x);
}
但是,我似乎不能正确地理解类型:
error[E0161]: cannot move a value of type dyn for<'r> FnOnce(&'r u64) -> u64: the size of dyn for<'r> FnOnce(&'r u64) -> u64 cannot be statically determined
--> playground/src/main.rs:19:69
|
19 | let mut increment_x = move |alterer: &dyn FnOnce(&u64) ->u64 | alterer(&x) ;
| ^^^^^^^
error[E0507]: cannot move out of `*alterer` which is behind a shared reference
--> playground/src/main.rs:19:69
|
19 | let mut increment_x = move |alterer: &dyn FnOnce(&u64) ->u64 | alterer(&x) ;
| ^^^^^^^ move occurs because `*alterer` has type `dyn for<'r> FnOnce(&'r u64) -> u64`, which does not implement the `Copy` trait
我不确定我是否有理由将 dyn
放在哪里,这是编译器的建议,我不确定为什么我为什么必须把它放在那里。是因为 Alterer
尽管输入/返回类型的&amp; amp; u64-&gt; u64
可能是任意大小的?
我还尝试使Alterer成为 fnmut
,而不是 fnonce
,但是我对它们的区别以及给定的更改> Alterer 只能运行一次(在外部闭合
change_x
的调用时)似乎是合理的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
fnonce
需要一个拥有的self
。因此,Alterer
不能是fnonce
,因为它不是拥有的,而是参考。您可以将其制作
&amp; dyn fn
或&amp; mut dyn fnmut
(我建议使用fnmut
),或进行box&lt; dyn fnonce&gt;
。FnOnce
needs an ownedself
. Thusalterer
cannot beFnOnce
, because it is not owned but a reference.You can either make it
&dyn Fn
or&mut dyn FnMut
(I'd recommend going withFnMut
), or takeBox<dyn FnOnce>
.