堆叠的参考/解引用符号

时间:2014-11-22 10:58:26

标签: reference rust

让我们有一个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,这更加令人满意。

1 个答案:

答案 0 :(得分:2)

box运算符可用于解构Box 1 。这样就行了(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。有计划使它在可引用类型上更通用