如何在Rust中一次使用Vec中的多个项目?

时间:2016-12-22 14:58:52

标签: rust

我一直在与借阅检查员争吵......我想要做的就是:

SET NOCOUNT ON;

这是我遇到的问题的一个非常通用的版本。这是stderr:

{{1}}

所以借用检查器不允许我借两次向量(一次是可变的,然后又是不可变的),我理解。但令人沮丧的是,我想修改向量中的一个元素,只读取另一个元素。我是Rust的新手(惊喜!),我不确定我是否已经把我的想法全部包含在所有细节和设计选择中。但这是感觉它应该工作的东西,但却没有。我错过了什么,我能做些什么来使这个(或类似的行为)起作用?非常感谢任何帮助!

2 个答案:

答案 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]引用相同的值。

如何使其发挥作用

当然,索引运算符并没有以这种愚蠢的方式实现,我们知道这一点。为了获得对向量的不同元素的两个引用(其中至少一个是可变的),我们必须使用一些特殊函数而不是索引运算符。并且有很多方法可以做到:

我无法告诉您使用何种方法,因为我不知道您的确切用例。但只是为了修复你的例子,你可以写:

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>