https://doc.rust-lang.org/rust-by-example/fn/closures/closure_examples/iter_any.html
Rust书提到迭代器::any作为闭包的例子,迭代器(iterator::any)将函数作为参数,并附加FnMut条件。根据我的理解,FnMut不应该消耗该值,而只能可变地借用它。只允许通过FnOnce进行消耗。所以我认为下面的代码不会编译,因为drop(x)显然消耗了x,但它编译了,所以我不知道drop(x)是否不消耗值x,或者函数输入参数是否可以通过编译器更改。
let array1 = [1, 2, 3];
array1.iter().any(|&x| {
drop(x);
return true;
})
这里有一些误解需要解释。
-
闭包特征
FnMut
、Fn
和FnOnce
都可以通过引用或值接收它们的自变量。闭包类型与参数的传递方式正交。使用其参数的函数可以被调用多次,每次都会使用其参数。毕竟,每次都是新的争论。FnOnce
闭包的特殊之处在于,调用它将消耗闭包本身。 -
FnMut
闭包在被调用时可以修改本身,即您至少需要一个可变的闭包借位才能调用它。 -
接受
FnMut
闭包的函数也将接受任何Fn
闭包,因为所有Fn
闭包都是隐式FnMut
。 -
你的闭包实际上并没有消耗它的论点。传递给闭包的参数的类型为
&i32
,使用析构函数模式提取i32
值x
。这只是因为i32
实现了Copy
特性——您实际上收到了整数的副本,因为它不允许从借位中移出值。删除Copy
的值不会有任何作用——同样,只有该值的副本会传递给drop()
,而Copy
类型永远无法实现Drop
特性。