2014-11-22 51 views
0

讓我們有一個枚舉的lambda項:堆積參考/反引用符號

#[deriving(Show, Clone, Eq, PartialEq)] 
enum Term { 
    Var(uint), 
    App(Box<Term>, Box<Term>), 
    Lam(uint, Box<Term>) 
} 

我寫了簡單的遞歸函數我能想到的:

fn size(t: &Term) -> uint { 
    match *t { 
     Var(_) => 1, 
     App(ref f, ref x) => 1 + size(&**f) + size(&**x), 
     Lam(_, ref t) => 1 + size(&**t) 
    } 
} 

&** -s不可避免的嗎?在這種簡單的情況下,我發現三個運營商有點多。另外,如果我想突變遞歸調用變成&mut**x,這更是一口。

回答

2

box運營商可用於解構框。因此,這將工作(在ref有助於避免一招,方便使它成爲一個&Term

fn size(t: &Term) -> uint { 
    match *t { 
     Var(_) => 1, 
     App(box ref f, box ref x) => 1 + size(f) + size(x), 
     Lam(_, box ref t) => 1 + size(t) 
    } 
} 

#[deriving(Show, Clone, Eq, PartialEq)] 
enum Term { 
    Var(uint), 
    App(Box<Term>, Box<Term>), 
    Lam(uint, Box<Term>) 
} 

playpen

1.有計劃,使其在deferenceable類型更通用