rust迭代器::any只接受FnMut签名的函数



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;
})

这里有一些误解需要解释。

  1. 闭包特征FnMutFnFnOnce都可以通过引用或值接收它们的自变量。闭包类型与参数的传递方式正交。使用其参数的函数可以被调用多次,每次都会使用其参数。毕竟,每次都是新的争论。FnOnce闭包的特殊之处在于,调用它将消耗闭包本身

  2. FnMut闭包在被调用时可以修改本身,即您至少需要一个可变的闭包借位才能调用它。

  3. 接受FnMut闭包的函数也将接受任何Fn闭包,因为所有Fn闭包都是隐式FnMut

  4. 你的闭包实际上并没有消耗它的论点。传递给闭包的参数的类型为&i32,使用析构函数模式提取i32x。这只是因为i32实现了Copy特性——您实际上收到了整数的副本,因为它不允许从借位中移出值。删除Copy的值不会有任何作用——同样,只有该值的副本会传递给drop(),而Copy类型永远无法实现Drop特性。

最新更新