在Rust 1.0中,编译器在分析表达式中的所有权时是否考虑评估顺序?例如:
struct Foo { val:usize }
fn main() {
let mut v:Vec<Foo> = Vec::with_capacity(1);
v.push(Foo{val:0});
let f = Foo{val:0};
v[f.val] = f; // error: use of moved value
}
编译失败,因为数组中的索引是f.val
,而f
正在移入数组。我不明白为什么使用f.val
作为LHS的索引可能与RHS上'f'的所有权转移相冲突。
答案 0 :(得分:1)
这种事情在语言层面没有明确定义,但显然编译器必须做某事。
答案 1 :(得分:1)
我建议你为你的结构派生Clone
和Copy
,之后价值不会移动,但它会被复制,这样可以解决你的问题(价值不会因为结构很小,所以也很有效。
#[derive(Clone, Copy)]
struct Foo { val: usize }
<强>更新强>
如果您不想派生Copy
,您可以先通过复制索引轻松解决此问题,然后再执行以下任务:
let index = f.val; // usize is copyable, so no moves here
v[index] = f;
这显然会强制评估的顺序。