在rust

时间:2019-05-06 22:21:52

标签: rust move

生锈的新手,我已经过了借阅检查器卡住的阶段,但是我对这段代码为什么起作用或通过感到困惑。我正在实现一个类似结构的枚举,该枚举充当某种形式的节点,可以附加到以下节点:

#[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的新变量并删除了旧变量吗?

1 个答案:

答案 0 :(得分:5)

这称为可变阴影。第二个foo的绑定值不等于第一个<!DOCTYPE html> <html> <head> <div> <title>My Page</title> <h1>test</h1> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="Name" <link href="https://fonts.googleapis.com/css?family=Nunito:400,600,700" rel="stylesheet"> <link rel="stylesheet" href="style.css" /> </div> <script src="https://www.gstatic.com/firebasejs/5.11.0/firebase-app.js"></script> <script src="https://www.gstatic.com/firebasejs/5.11.0/firebase-auth.js"></script> <script src="https://www.gstatic.com/firebasejs/5.11.0/firebase-database.js"></script> <script> var config = { apiKey: "", authDomain: "", databaseURL: "", projectId: "", storageBucket: "", messagingSenderId: "" }; firebase.initializeApp(config); </script> <script src="webapp.js"></script> </head> <body> <div class="main-div"> <h2>Test2</h2> <input id="txtEmail" type="email" placeholder="Email..." /> <input id="txtPass" type="password" placeholder="Password..." /> <button type="button" onclick="login()" >Login Here</button> <div> </body> </html> .JS file function login() { email = document.getElementById('txtEmail').value; password = document.getElementById('txtPass').value; loginBtn = document.getElementById('loginBtn');`enter code here` firebase.auth().signInWithEmailAndPassword(email, password).catch(function(error) { var errorCode = error.code; var errorMessage = error.message; if (errorCode === 'auth/wrong-password') { alert('Wrong password, try again!.'); } else { alert(errorMessage); } console.log(error); }); } function initApp() { firebase.auth().onAuthStateChanged(function(user) { if(user) { // User is signed in window.location = 'secondpage.html'; } else { alert('test!.'); } } )} ,而是一个全新的值。有关更多详细信息,请查看Shadowing chapter of The Rust Book,即:

  

[...]您可以声明一个与先前变量同名的新变量,并且新变量会覆盖先前的变量。 Rustaceans说,第一个变量被第二个变量遮盖,这意味着第二个变量的值就是使用该变量时出现的值。