2015-12-13 58 views
3

我有一個盒裝元組以避免遞歸。但是,當我對元組進行模式匹配時,我似乎無法獲得這兩個元組值。爲了說明我的問題,採取the following code搬出盒裝元組

#[derive(Clone, PartialEq, Debug)] 
enum Foo { 
    Base, 
    Branch(Box<(Foo, Foo)>) 
} 

fn do_something(f: Foo) -> Foo { 
    match f { 
    Foo::Base => Foo::Base, 
    Foo::Branch(pair) => { 
     let (f1, f2) = *pair; // ... What do I do here? 
     if f2 == Foo::Base { f1 } else { f2 } 
    } 
    } 
} 

所以我的問題是如何獲取到盒子裏面既元組值而不必調用clone或類似的東西做一個副本。我已經閱讀過關於盒裝語法的內容,但是如果可能的話,我想避免不穩定的特性。這感覺就像是唯一的答案被重新定義爲Branch

Branch(Box<Foo>, Box<Foo>) 

,但是這似乎是它避免回答這個問題(這是無可否認的主要思想運動在這一點)。

+2

給出答案,我希望這可以作爲rustc的一個bug。您可能想要打開一個錯誤報告,以便檢查並修復它。 –

回答

2

拆箱分兩個步驟工作:

fn do_something(f: Foo) -> Foo { 
    match f { 
    Foo::Base => Foo::Base, 
    Foo::Branch(pair) => { 
     let pair = *pair; 
     let (f1, f2) = pair; 
     if f2 == Foo::Base { f1 } else { f2 } 
    } 
    } 
} 
2

花括號內封閉也適用。

fn do_something(f: Foo) -> Foo { 
    match f { 
     Foo::Base => Foo::Base, 
     Foo::Branch(pair) => { 
      let (f1, f2) = {*pair}; 
      if f2 == Foo::Base { f1 } else { f2 } 
     } 
    } 
}