首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何改变向量中元素的字段?

如何改变向量中元素的字段?
EN

Stack Overflow用户
提问于 2017-04-21 19:32:34
回答 5查看 29.4K关注 0票数 21

我有一个结构类型的vec,我想改变向量中第一个元素的一些字段。我该怎么做?

示例:

代码语言:javascript
运行
复制
struct SomeType {
    some_value: i32,
}

fn main() {
    let mut vec = Vec::new();
    let mut t = SomeType { some_value: 45 };
    vec.push(t);

    println!("Old value: {}", vec.first().unwrap().some_value);
    vec.first().unwrap().some_value += 1;
    println!("New value: {}", vec.first().unwrap().some_value);
}

这不能编译:

代码语言:javascript
运行
复制
error: cannot assign to immutable field
  --> vec.rs:15:2
   |
15 |    vec.first().unwrap().some_value += 1;
   |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot mutably borrow immutable field

我还不能把我的头转到铁锈里的易变的东西上,这里的正确方法是什么?

EN

Stack Overflow用户

回答已采纳

发布于 2017-04-21 20:35:12

要变异向量的第一个元素,通常会得到对该元素的引用。换句话说,是对向量的引用。作为一个正常的结构,向量需要有一个方法来为你提供参考。

问题是,对向量的引用意味着您可以对向量的内部进行一些操作,读取它们或以某种方式修改它们。铁锈不知道细节,它只知道当你拿着那个参考的时候,你可以做一些事情。

而只有这些有限的信息,借用检查铁锈试图阻止你射击自己的脚。它说:如果你要读取向量,好吧,你可以任意读取它,你甚至可以让其他函数读取它,或者两个函数,或者五个。但是当你读它的时候你不能修改它,它是不安全的,它会导致错误。因此,你可以有任意数量的只读引用到向量,但只有当你没有任何可写的引用到它。如果您持有一个可写引用,那么一次只能有一个这样的引用。

因此,这类参考资料很重要。这就是为什么向量有两个给出第一个元素的方法:第一穆特

所以在这里

代码语言:javascript
运行
复制
let mut vec = Vec::new();

你的向量已经变了。从其他语言来看,你可以凭直觉工作,如果向量是可变的,它总是可变的。有点像const值在C++中或immutable在D中,它要么是可变的,要么是不可变的。

但在Rust中,您可能希望将不变的引用放入可变结构中。例如,您可能希望一个线程在向量的一个元素上工作,而另一个线程在另一个元素上工作,如果您想要保持借贷检查器的安全带,那么拥有多个引用的最简单的方法就是保持它们不可变。这就是为什么像第一这样的方法返回不变的引用,要获得可变的引用,需要使用不同的方法显式选择。

那么这有什么帮助吗?

当算法需要读写的复杂组合时,使用usize 索引代替引用通常是有帮助的。

索引也可以这样使用。

票数 27
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43550632

复制
相关文章

相似问题

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