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

时间:2017-12-20 23:44:21

标签: rust

像这样的东西编译并运行良好:

#[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这样的容器的引用变得可变,那么它的元素“继承”它的可变性?

1 个答案:

答案 0 :(得分:2)

一般来说,可变性是继承的"由类型的字段取决于变量的绑定。来自 The Rust Programming Language ' 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;
}

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

另见: