2013-12-12 44 views
3

在鏽病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"); 
} 

代碼甚至不會編譯。該rust test認爲在第二assert_eq有一個錯誤:

error: use of partially moved value: strs

這是有點反直覺。我的意思是,無論第一個assert_eq可能具有的效果如何,當執行次數達到第二個assert_eq時,它應該超出範圍。當然,除非在場景後面出現一些東西。可以?

如果沒有,爲什麼這個神祕的錯誤?希望我對Rust指針的理解沒有根本的缺陷。

回答

6

生鏽0.8,assert_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); 
      } 
     } 
    ) 
) 

注意,它移動兩個參數納入地方讓-綁定given_valexpected_val。這是什麼導致你的錯誤。

在當前的主人,這已被修復。 assert_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) 
      } 
     } 
    ) 
) 

這意味着它不再移動它的參數,它修正你的錯誤。

如果您需要堅持生鏽0.8,您可以改爲使用assert!()代替,並直接進行比較,這將避免移動。但我的建議是升級到最新的主人。

3

它在Git master上工作。它必須是一個在0.8被削減後修復的bug。一般而言,發行版在發佈之前不會受到特別的限制 - 它們基本上只是快照。

assert_eq!宏的定義,在libsyntax,帶給參數引用,這樣的論點不能移動,你調用宏後,您可以使用它們。

如果您確實發現了另一個錯誤,請嘗試編譯主控,如果可以的話,或者只是創建一個新的issue

相關問題