在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移入数组时,数组中的索引为f.val。我看不出为甚麽以f.val作为本地房屋策略的索引,会与房屋策略中“f”的业权转移有冲突。
发布于 2015-07-12 02:37:13
我建议你为你的结构派生Clone和Copy,之后值不会移动,但它会被复制,这解决了你的问题(值不再被移动),也是有效的,因为结构非常小。
#[derive(Clone, Copy)]
struct Foo { val: usize }更新
如果你不想派生Copy,你可以很容易地克服这个问题,首先复制索引,然后再进行赋值:
let index = f.val; // usize is copyable, so no moves here
v[index] = f;这显然会强制执行评估的顺序。
发布于 2015-07-10 15:20:47
这类事情在语言级别上没有很好的定义,尽管很明显编译器必须做一些事情。
https://stackoverflow.com/questions/31329532
复制相似问题