我一直在与借阅检查员争吵......我想要做的就是:
SET NOCOUNT ON;
这是我遇到的问题的一个非常通用的版本。这是stderr:
{{1}}
所以借用检查器不允许我借两次向量(一次是可变的,然后又是不可变的),我理解。但令人沮丧的是,我想修改向量中的一个元素,只读取另一个元素。我是Rust的新手(惊喜!),我不确定我是否已经把我的想法全部包含在所有细节和设计选择中。但这是感觉它应该工作的东西,但却没有。我错过了什么,我能做些什么来使这个(或类似的行为)起作用?非常感谢任何帮助!
答案 0 :(得分:6)
我同意,这有点令人困惑。因此,让我们首先看一下,为什么Rust编译器不允许这样做。
索引运算符[]
可以重载,这意味着该语言的用户可以指定它的工作方式。 Rust尝试最小化编译器具有某些特殊知识的类型的数量。因此,尽管它很受欢迎,Vec<T>
只是一个由库定义的普通类型。您可以编写自己的Vec<T>
而无需告诉编译器!
Vec<T>
也会重载索引运算符,以允许索引向量。但由于重载可以做任何,它总是可以返回向量的第一个元素!如果你假设索引操作符会做这么奇怪的事情,那么不应该允许这段代码:
my_vec[0].change_value(my_vec[1].value.as_str());
因为my_vec[0]
和my_vec[1]
引用相同的值。
当然,索引运算符并没有以这种愚蠢的方式实现,我们知道这一点。为了获得对向量的不同元素的两个引用(其中至少一个是可变的),我们必须使用一些特殊函数而不是索引运算符。并且有很多方法可以做到:
split_first_mut()
split_at_mut()
iter_mut()
返回可变引用的迭代器我无法告诉您使用何种方法,因为我不知道您的确切用例。但只是为了修复你的例子,你可以写:
let (head, tail) = my_vec.split_first_mut();
head.change_value(tail[0].value.as_str());
答案 1 :(得分:2)
你是对的,你不能同时不可变地和可变地借用一个物体;为了使这项工作,您可以执行以下操作:
let new_value = my_vec[1].value.clone();
my_vec[0].change_value(&new_value);
当您从clone()
value
myvec[1]
时,您不再借用myvec
并可以在下一行中自由使用new_value
。< / p>