在模式匹配中,可以将&[&] [mut]附加到像v.iter().filter(|&e| ...)中的&e这样的标识符中。这叫做https://doc.rust-lang.org/reference/patterns.html#reference-patterns。
在玩这个模式时,我发现一个不一致的行为:
&&e有效,但&e也有效。&&mut e工作,而&mut e不工作。为什么?
fn main() {
let mut v = vec![1, 2, 3, 4, 5];
v.iter()
.filter(|e| *e * 2 >= 8)
.for_each(|e| println!("{}", e)); //=> 4 5
v.iter()
.filter(|e| **e * 2 >= 8)
.for_each(|e| println!("{}", e));
v.iter()
.filter(|&e| e * 2 >= 8)
.for_each(|e| println!("{}", e));
v.iter()
.filter(|&&e| e * 2 >= 8)
.for_each(|e| println!("{}", e));
//NG
// v.iter_mut()
// .filter(|&mut e| e * 2 >= 8)
// .for_each(|e| println!("{}", e));
v.iter_mut()
.filter(|&&mut e| e * 2 >= 8)
.for_each(|e| println!("{}", e));
}发布于 2022-09-19 15:27:26
从高层角度看:
&mut T是T类型的可变引用,&&mut T是&mut T的不变引用。
从编译器的角度看: (参考)
引用模式的语法生成必须匹配令牌
&&来匹配对引用的引用,因为它本身是一个令牌,而不是两个&标记。 添加mut关键字取消可变引用
基本上,&&将不可变引用指向不可变引用(如果存在不可变引用,则取消对可变引用的引用(不可变引用到可变引用,即如上所述)。
&mut e无法工作,因为来自std::iter的方法滤波器要求您使用不可变的引用参数定义闭包:
fn filter<P>(self, predicate: P) -> Filter<Self, P>
where
P: FnMut(&Self::Item) -> bool, &&mut T模式可以工作,因为Self::Item是一个&mut T,因为您使用的是iter_mut()。
发布于 2022-09-19 15:20:52
锈蚀编译器说:可以借用多个不可变的引用,但不能在定义的范围内借用多个可变的引用。
let e = 23;在这里,我们可以借用&e的多个不可变引用或引用&&e的引用,我们的代码不会中断,因为编译器知道所有的引用都是不可变的,因此没有人可以更改值。
但是,假设我们借用了引用&&mut e的可变引用,这里的问题是,我们有两个相同对象的可变引用(I:&mut e,II:&&mut e),任何人都可以更改e的值,而且根据规则,我们不允许在作用域中有两个相同对象的可变引用。
如果我错了,请纠正我。
https://stackoverflow.com/questions/73772399
复制相似问题