首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候双符号&&可以缩短到一个&&

什么时候双符号&&可以缩短到一个&&
EN

Stack Overflow用户
提问于 2022-09-19 11:05:32
回答 2查看 138关注 0票数 2

在模式匹配中,可以将&[&] [mut]附加到像v.iter().filter(|&e| ...)中的&e这样的标识符中。这叫做https://doc.rust-lang.org/reference/patterns.html#reference-patterns

在玩这个模式时,我发现一个不一致的行为:

  • 对于双借入值而言,&&e有效,但&e也有效。
  • 但是,当可变时,&&mut e工作,而&mut e不工作。

为什么?

代码语言:javascript
复制
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));

}

铁锈游乐场

EN

回答 2

Stack Overflow用户

发布于 2022-09-19 15:27:26

从高层角度看

&mut TT类型的可变引用,&&mut T&mut T的不变引用。

从编译器的角度看 (参考)

引用模式的语法生成必须匹配令牌&&来匹配对引用的引用,因为它本身是一个令牌,而不是两个&标记。 添加mut关键字取消可变引用

基本上,&&将不可变引用指向不可变引用(如果存在不可变引用,则取消对可变引用的引用(不可变引用到可变引用,即如上所述)。

  • 然而,当可变时,&&mut e工作,而&mut e不工作。

&mut e无法工作,因为来自std::iter方法滤波器要求您使用不可变的引用参数定义闭包:

代码语言:javascript
复制
fn filter<P>(self, predicate: P) -> Filter<Self, P>
where
    P: FnMut(&Self::Item) -> bool, 

&&mut T模式可以工作,因为Self::Item是一个&mut T,因为您使用的是iter_mut()

票数 5
EN

Stack Overflow用户

发布于 2022-09-19 15:20:52

锈蚀编译器说:可以借用多个不可变的引用,但不能在定义的范围内借用多个可变的引用。

代码语言:javascript
复制
let e = 23;

在这里,我们可以借用&e的多个不可变引用或引用&&e的引用,我们的代码不会中断,因为编译器知道所有的引用都是不可变的,因此没有人可以更改值。

但是,假设我们借用了引用&&mut e的可变引用,这里的问题是,我们有两个相同对象的可变引用(I:&mut e,II:&&mut e),任何人都可以更改e的值,而且根据规则,我们不允许在作用域中有两个相同对象的可变引用。

如果我错了,请纠正我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73772399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档