我有一个结构类型的vec,我想改变向量中第一个元素的一些字段。我该怎么做?
示例:
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);
}这不能编译:
error: cannot assign to immutable field
--> vec.rs:15:2
|
15 | vec.first().unwrap().some_value += 1;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot mutably borrow immutable field我还不能把我的头转到铁锈里的易变的东西上,这里的正确方法是什么?
发布于 2017-04-21 20:35:12
要变异向量的第一个元素,通常会得到对该元素的引用。换句话说,是对向量的引用。作为一个正常的结构,向量需要有一个方法来为你提供参考。
问题是,对向量的引用意味着您可以对向量的内部进行一些操作,读取它们或以某种方式修改它们。铁锈不知道细节,它只知道当你拿着那个参考的时候,你可以做一些事情。
而只有这些有限的信息,借用检查铁锈试图阻止你射击自己的脚。它说:如果你要读取向量,好吧,你可以任意读取它,你甚至可以让其他函数读取它,或者两个函数,或者五个。但是当你读它的时候你不能修改它,它是不安全的,它会导致错误。因此,你可以有任意数量的只读引用到向量,但只有当你没有任何可写的引用到它。如果您持有一个可写引用,那么一次只能有一个这样的引用。
因此,这类参考资料很重要。这就是为什么向量有两个给出第一个元素的方法:第一和穆特。
所以在这里
let mut vec = Vec::new();你的向量已经变了。从其他语言来看,你可以凭直觉工作,如果向量是可变的,它总是可变的。有点像const值在C++中或immutable在D中,它要么是可变的,要么是不可变的。
但在Rust中,您可能希望将不变的引用放入可变结构中。例如,您可能希望一个线程在向量的一个元素上工作,而另一个线程在另一个元素上工作,如果您想要保持借贷检查器的安全带,那么拥有多个引用的最简单的方法就是保持它们不可变。这就是为什么像第一这样的方法返回不变的引用,要获得可变的引用,需要使用不同的方法显式选择。
那么这有什么帮助吗?
当算法需要读写的复杂组合时,使用usize 索引代替引用通常是有帮助的。
索引也可以这样使用。
发布于 2017-04-21 20:37:32
下面是同样工作的代码示例:
vec[0].some_value += 1;
vec.first_mut().unwrap().some_value += 1;所讨论的代码的问题是,first()返回第一个元素的(不可变)引用,但需要可变引用。
索引([0])的工作方式如下:
vec去切片index_mut特性对片调用IndexMut方法进行索引index_mut方法返回可变引用(&mut someType)发布于 2018-02-26 02:10:19
我想你是在找&mut做参考。
#[derive(Debug)]
struct Character{
name: String,
}
fn main() {
let mut hobbits = vec![
Character{name:String::from("Sam")},
Character{name:String::from("Merry")},
Character{name:String::from("Pepper")},
];
{
let third = &mut hobbits[2];
third.name = String::from("Pippin");
}
println!("{:?}", hobbits);
}注意可变元素引用周围的{}。它需要限制可变的引用范围。不能同时具有可变和不可变的引用:println!将在third仍在作用域时失败。
https://stackoverflow.com/questions/43550632
复制相似问题