像这样的东西编译并运行良好:
#[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
这样的容器的引用变得可变,那么它的元素“继承”它的可变性?
答案 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;,它是通过方法实现明确授予的。
另见: