Rust 锈蚀:使用部分移动的值

Rust 锈蚀:使用部分移动的值,rust,Rust,在0.8中: struct TwoStr { one: ~str, two: ~str, } #[test] fn test_contents() { let strs = TwoStr { one: ~"pillar", two: ~"post", }; assert_eq!(strs.one, ~"pillar"); assert_eq!(strs.two, ~"post"); } 代码甚至无法编译。防锈测试认为第二个断言中有错误: 错误:使用部

在0.8中:

struct TwoStr {
  one: ~str,
  two: ~str,
}

#[test]
fn test_contents() {
  let strs = TwoStr {
    one: ~"pillar",
    two: ~"post",
  };

  assert_eq!(strs.one, ~"pillar");
  assert_eq!(strs.two, ~"post");
}
代码甚至无法编译。
防锈测试认为第二个
断言中有错误:

错误:使用部分移动的值:
strs

这有点违反直觉。我的意思是,无论第一个
assert\u eq
可能有什么影响,当执行到达第二个
assert\u eq
时,它应该远远超出范围。当然,除非它在幕后繁殖。是吗


如果不是,为什么会出现这种神秘的错误?希望我对生锈指针的理解没有根本性的缺陷。

它在Git master上运行。它一定是在0.8被剪切后修复的错误。一般来说,发布的版本在发布之前并不一定要特别稳定——它们本质上只是快照

assert\u eq!的定义宏”引用参数,因此不应移动参数,您可以在调用宏后使用它们


如果您确实发现了另一个bug,请尽可能尝试编译master,或者只是创建一个新的bug

在Rust 0.8中,
assert\u eq定义为

macro_rules! assert_eq (
    ($given:expr , $expected:expr) => (
        {
            let given_val = $given;
            let expected_val = $expected;
            // check both directions of equality....
            if !((given_val == expected_val) && (expected_val == given_val)) {
                fail!(\"assertion failed: `(left == right) && (right == \
                left)` (left: `%?`, right: `%?`)\", given_val, expected_val);
            }
        }
    )
)
请注意,它将这两个参数都移动到本地let绑定
给定的\u val
预期的\u val
。这就是导致错误的原因

在当前主控中,此问题已修复<代码>断言现在引用参数:

macro_rules! assert_eq (
    ($given:expr , $expected:expr) => (
        {
            let given_val = &($given);
            let expected_val = &($expected);
            // check both directions of equality....
            if !((*given_val == *expected_val) &&
                 (*expected_val == *given_val)) {
                fail!("assertion failed: `(left == right) && (right == left)` \
                       (left: `{:?}`, right: `{:?}`)", *given_val, *expected_val)
            }
        }
    )
)
这意味着它不再移动其参数,从而修复错误

如果您需要使用rust 0.8,可以将其更改为使用
assert!()
而是直接进行比较,这样可以避免移动。但我的建议是升级到最新的master