rust iterator::any 只接受哪个 FnMut 签名的函数?

rust iterator::any only accepts function which FnMut signature?

https://doc.rust-lang.org/rust-by-example/fn/closures/closure_examples/iter_any.html

Rust book 提到 iterator::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,因为它不允许从借用中移出一个值.删除一个 Copy 的值根本没有任何作用——同样,只有该值的副本被传递给 drop(),并且 Copy 类型永远无法实现 Drop 特性。