生锈的新手,我已经过了借阅检查器卡住的阶段,但是我对这段代码为什么起作用或通过感到困惑。我正在实现一个类似结构的枚举,该枚举充当某种形式的节点,可以附加到以下节点:
#[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的新变量并删除了旧变量吗?
答案 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说,第一个变量被第二个变量遮盖,这意味着第二个变量的值就是使用该变量时出现的值。