变量被隐藏的值的所有权
Ownership of values whose variables are shadowed
查看下面的一些代码:
#[derive(Debug)]
struct MyString {
a: String,
}
impl MyString {
fn new(s: &str) -> Self {
MyString { a: String::from(s) }
}
}
impl Deref for MyString {
type Target = String;
fn deref(&self) -> &Self::Target {
&self.a
}
}
impl Drop for MyString {
fn drop(&mut self) {
println!("{} dropped!", self.a);
}
}
fn main() {
let mut test1 = MyString::new("test1");
let mut test1 = MyString::new(&test1);
println!("shadow variable test1");
test1.a = String::from("test2");
}
我以为应该是编译错误,因为test1还是借用的
但是没有编译错误,结果是
shadow variables test1
test2 dropped
test1 dropped
所以如果一个变量被隐藏了,这个值在当前范围内仍然有效。
但它的主人是谁?
从所有权的角度来看,您的代码完全等同于:
fn main() {
let mut test1_1 = MyString::new("test1");
let mut test1_2 = MyString::new(&test1_1);
println!("shadow variable test1");
test1_2.a = String::from("test2");
}
所以 test1_1
在 main
函数结束时超出范围时被丢弃。
另请注意,test1_2
不 借用 test1_1
,借用只持续到 MyString::new(&test1)
的调用。之后两个变量之间就没有联系了。
查看下面的一些代码:
#[derive(Debug)]
struct MyString {
a: String,
}
impl MyString {
fn new(s: &str) -> Self {
MyString { a: String::from(s) }
}
}
impl Deref for MyString {
type Target = String;
fn deref(&self) -> &Self::Target {
&self.a
}
}
impl Drop for MyString {
fn drop(&mut self) {
println!("{} dropped!", self.a);
}
}
fn main() {
let mut test1 = MyString::new("test1");
let mut test1 = MyString::new(&test1);
println!("shadow variable test1");
test1.a = String::from("test2");
}
我以为应该是编译错误,因为test1还是借用的
但是没有编译错误,结果是
shadow variables test1
test2 dropped
test1 dropped
所以如果一个变量被隐藏了,这个值在当前范围内仍然有效。 但它的主人是谁?
从所有权的角度来看,您的代码完全等同于:
fn main() {
let mut test1_1 = MyString::new("test1");
let mut test1_2 = MyString::new(&test1_1);
println!("shadow variable test1");
test1_2.a = String::from("test2");
}
所以 test1_1
在 main
函数结束时超出范围时被丢弃。
另请注意,test1_2
不 借用 test1_1
,借用只持续到 MyString::new(&test1)
的调用。之后两个变量之间就没有联系了。