首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在分析表达式中的所有权时,是否考虑了计算顺序?

在分析表达式中的所有权时,是否考虑了计算顺序?
EN

Stack Overflow用户
提问于 2015-07-10 06:42:04
回答 2查看 125关注 0票数 4

在Rust 1.0中,编译器在分析表达式中的所有权时是否考虑求值顺序?例如:

代码语言:javascript
运行
复制
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”的业权转移有冲突。

EN

回答 2

Stack Overflow用户

发布于 2015-07-12 02:37:13

我建议你为你的结构派生CloneCopy,之后值不会移动,但它会被复制,这解决了你的问题(值不再被移动),也是有效的,因为结构非常小。

代码语言:javascript
运行
复制
#[derive(Clone, Copy)]
struct Foo { val: usize }

更新

如果你不想派生Copy,你可以很容易地克服这个问题,首先复制索引,然后再进行赋值:

代码语言:javascript
运行
复制
let index = f.val; // usize is copyable, so no moves here
v[index] = f;

这显然会强制执行评估的顺序。

票数 1
EN

Stack Overflow用户

发布于 2015-07-10 15:20:47

这类事情在语言级别上没有很好的定义,尽管很明显编译器必须做一些事情。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31329532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档