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;
})
此处存在一些误解。
闭包特征 FnMut
、Fn
和 FnOnce
都可以通过引用或值接收它们的参数。闭包类型与参数的传递方式正交。一个消耗其参数的函数可以被调用多次,并且每次都会消耗其参数。毕竟,每次都是一个新的论点。 FnOnce
闭包的特殊之处在于调用它会 消耗闭包本身 .
一个FnMut
闭包在被调用时允许修改自身,即你至少需要一个闭包的可变借用可以调用了。
接受 FnMut
闭包的函数也将接受任何 Fn
闭包,因为所有 Fn
闭包都是隐式的 FnMut
.
您的闭包实际上并未使用其参数。传递给闭包的参数具有类型 &i32
,并且您使用解构模式来提取 i32
值 x
。这只有效,因为 i32
实现了 Copy
特性——你实际上收到了整数的 copy,因为它不允许从借用中移出一个值.删除一个 Copy
的值根本没有任何作用——同样,只有该值的副本被传递给 drop()
,并且 Copy
类型永远无法实现 Drop
特性。
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;
})
此处存在一些误解。
闭包特征
FnMut
、Fn
和FnOnce
都可以通过引用或值接收它们的参数。闭包类型与参数的传递方式正交。一个消耗其参数的函数可以被调用多次,并且每次都会消耗其参数。毕竟,每次都是一个新的论点。FnOnce
闭包的特殊之处在于调用它会 消耗闭包本身 .一个
FnMut
闭包在被调用时允许修改自身,即你至少需要一个闭包的可变借用可以调用了。接受
FnMut
闭包的函数也将接受任何Fn
闭包,因为所有Fn
闭包都是隐式的FnMut
.您的闭包实际上并未使用其参数。传递给闭包的参数具有类型
&i32
,并且您使用解构模式来提取i32
值x
。这只有效,因为i32
实现了Copy
特性——你实际上收到了整数的 copy,因为它不允许从借用中移出一个值.删除一个Copy
的值根本没有任何作用——同样,只有该值的副本被传递给drop()
,并且Copy
类型永远无法实现Drop
特性。