Closures 如果参数是按值取的,为什么还要麻烦使用'FnMut'?

Closures 如果参数是按值取的,为什么还要麻烦使用'FnMut'?,closures,rust,Closures,Rust,以下是一个例子: pub特征迭代器{ //正在迭代的类型。 类型项目; //`any`takes`&mut self`表示呼叫者可能被借用 //和修改,但不消耗。 fn任意(&mut self,f:f)->bool where //`FnMut`表示任何捕获的变量最多可以是 //已修改,未使用。`Self::Item`表示需要 //通过值为闭包添加参数。 F:FnMut(Self::Item)->bool{} } 如果参数是按值获取的,为什么还要麻烦使用FnMut,因为该参数无论如何都不能变异

以下是一个例子:

pub特征迭代器{
//正在迭代的类型。
类型项目;
//`any`takes`&mut self`表示呼叫者可能被借用
//和修改,但不消耗。
fn任意(&mut self,f:f)->bool where
//`FnMut`表示任何捕获的变量最多可以是
//已修改,未使用。`Self::Item`表示需要
//通过值为闭包添加参数。
F:FnMut(Self::Item)->bool{}
}
如果参数是按值获取的,为什么还要麻烦使用
FnMut
,因为该参数无论如何都不能变异?事实上,为什么这里甚至允许
FnMut
?似乎只有一次fn:

已经注意到,Rust选择如何在 不加注释地飞行。这在正常使用中都非常方便 但是,在编写函数时,不允许出现这种歧义。这个 闭包的完整类型(包括捕获类型)必须是 注释。闭包使用的捕获方式被注释为 以下
trait
s:

  • Fn
    :通过引用获取捕获(
    &T
  • FnMut
    :通过可变引用获取捕获(
    &mutt
  • FnOnce
    :按值获取捕获(
    T

FnOnce
FnMut
Fn
之间的区别在于函数访问其环境的方式(分别为移动、可变引用和共享引用)。它与访问函数的参数无关

此处需要
FnMut
,因为
任何
方法可能需要多次调用该函数

有一个问题。它显示了
self
参数中的差异,该参数本质上是一个包含环境的
struct

如果参数是按值获取的,为什么还要麻烦使用FnMut,因为arg无论如何都不能进行变异

您链接的示例有点不正确,因为方法定义应该如下所示:

fn any<F>(&mut self, mut f: F) -> bool  // note the `mut f: F`
    where F: FnMut(Self::Item) -> bool {}
这是有效的,但没有用处,因为只要您想用迭代器做一些可用的事情(比如调用
next
):


您将得到一个编译器错误,因为您不能对不可变的借阅调用
&mut self
方法。因此,您链接的示例只起作用,因为函数体不使用
FnMut

的功能,您所说的“参数按值取值”是什么意思?你说的是
f:f
?是的。F按值取参数。你能澄清一下你认为应该做什么而不是使用
FnMut
?当然,请看我的编辑。为什么不能定义
any
来取
Fn
闭包?@ruohola-Oof,这是我一个多么古老而不太好的答案。关于您的问题:因为
FnMut
允许用户做更多的事情(即改变其环境)。虽然它通常不是必需的,也没有多大意义,但我们仍然可以将此功能赋予
any
的用户,因为为什么不呢?
fn any<F>(&mut self, mut f: F) -> bool  // note the `mut f: F`
    where F: FnMut(Self::Item) -> bool {}
fn foo<T: Iterator<Item=i32>>(it: &T) {}
it.next();