我刚接触Rust,已经过了被借用检查器卡住的阶段,但是我现在遇到了另一个问题,就是为什么这段代码能够工作或者通过。我正在实现一个类似结构体的枚举类型,它充当一种可以添加到节点的形式:
#[derive(Debug)]
enum Node {
Val {num:u32, next:Box<Node>},
Nil
}
impl Node {
fn put_next(&self, i:u32) -> Node {
match self {
Node::Val {num, next:_} => Node::Val {num:*num, next:Box::new(Node::Val {num:i, next:Box::new(Node::Nil)})},
Node::Nil => Node::Val {num:i, next:Box::new(Node::Nil)}
}
}
}
以下的
main
函数显然无法使用,因为你不能对一个不可变的变量进行赋值:fn main() {
let foo = Node::Val {num:5, next:Box::new(Node::Nil)};
foo = foo.put_next(30);
println!("foo {:?} ", foo);
}
然而,如果我再次使用
let
来定义 foo,代码就可以正常运行,没有错误!fn main() {
let foo = Node::Val {num:5, next:Box::new(Node::Nil)};
let foo = foo.put_next(30);
println!("foo {:?} ", foo);
}
// foo Val { num: 5, next: Val { num: 30, next: Nil } }
我的问题是,为什么编译器允许使用let
多次声明同一个变量?如果这是有意的,那意味着什么?它会在幕后创建一个名为foo的新变量并丢弃旧的吗?