让我们有一个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
,这更加令人满意。
答案 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。有计划使它在可引用类型上更通用