容器的成员是否继承了其可变性?

问题描述 投票:2回答:1

像这样的东西编译并运行正常:

#[derive(Clone)]
struct Member {
    x: i32,
}

fn main() {
    let mut arr = vec![Member { x: 5 }; 5];

    arr[0].x = 25;

    println!("{}", arr[0].x); // Gives 25
}

是因为如果对Vec这样的容器的引用变得可变,那么它的元素“继承”它的可变性吗?

rust
1个回答
2
投票

通常,可变性由类型的字段“继承”,具体取决于变量的绑定。来自Rust编程语言的chapter on defining structs

如果实例是可变的,我们可以使用点表示法并分配到特定字段来更改值

[...]

请注意,整个实例必须是可变的

然而,这不是这里发生的事情。作为Veedrac points out in the comments,您没有访问容器的字段,但是您正在调用方法。

[]运算符由IndexMut trait提供支持:

pub trait IndexMut<Idx>: Index<Idx>
where
    Idx: ?Sized,
{
    fn index_mut(&mut self, index: Idx) -> &mut Self::Output;
}

您的代码转换为类似于:

{
    let tmp: &mut Member = IndexMut::index_mut(&mut arr, 0);
    tmp.x = 25;
}

在这种情况下,没有任何东西是“继承的”,它是通过方法实现明确授予的。

也可以看看:

© www.soinside.com 2019 - 2024. All rights reserved.