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