gpt4 book ai didi

rust - 容器的成员是否继承了它的可变性?

转载 作者:行者123 更新时间:2023-11-29 08:07:42 25 4
gpt4 key购买 nike

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

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

最佳答案

通常,可变性由类型的字段“继承”,具体取决于变量的绑定(bind)。来自 The Rust Programming Languagechapter on defining structs :

If the instance is mutable, we can change a value by using the dot notation and assigning into a particular field

[...]

Note that the entire instance must be mutable

然而,这不是这里发生的事情。作为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;
}

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

另见:

关于rust - 容器的成员是否继承了它的可变性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47915905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com