【发布时间】:2021-01-30 05:09:30
【问题描述】:
我正在完成这个练习(可变的传递可变引用)并且无法理解结果
#[derive(Debug)]
struct Person {
name: String,
age: u32,
}
fn birthday_mutable<'a>(mut person: &'a mut Person, replacement: &'a mut Person) {
println!("[InFn] Before : Alice {:p} : {:?}, Bob {:p} : {:?}", &person, person, &replacement, replacement);
person = replacement;
println!("[InFn] After : Alice {:p} : {:?}", &person, person);
}
fn main() {
let mut alice = Person {
name: String::from("Alice"),
age: 30,
};
let mut bob = Person {
name: String::from("Bob"),
age: 20,
};
println!("[Main] Before : Alice {:p} : {:?}, Bob {:p} : {:?}", &alice, alice, &bob, bob);
birthday_mutable(&mut alice, &mut bob);
println!("[Main] After : Alice {:p} : {:?}, Bob {:p} : {:?}", &alice, alice, &bob, bob);
}
在birthday_mutable 函数中,person 位于一个可变变量中。我们做的第一件事是人=替换;。这会改变我们的 person 变量所指向的内容,并且根本不会修改引用所指向的原始值。
尽管改变了人指向的东西,但结果是这样的
[Main] Before : Alice 0x7ffd0c9b77e0 : Person { name: "Alice", age: 30 }, Bob 0x7ffd0c9b7820 : Person { name: "Bob", age: 20 }
[InFn] Before : Alice 0x7ffd0c9b7568 : Person { name: "Alice", age: 30 }, Bob 0x7ffd0c9b7570 : Person { name: "Bob", age: 20 }
[InFn] After : Alice 0x7ffd0c9b7568 : Person { name: "Bob", age: 20 }
[Main] After : Alice 0x7ffd0c9b77e0 : Person { name: "Alice", age: 30 }, Bob 0x7ffd0c9b7820 : Person { name: "Bob", age: 20 }
根据我的理解,结果不应该是这样吗?
[Main] Before : Alice 0x7ffd0c9b77e0 : Person { name: "Alice", age: 30 }, Bob 0x7ffd0c9b7820 : Person { name: "Bob", age: 20 }
[InFn] Before : Alice 0x7ffd0c9b7568 : Person { name: "Alice", age: 30 }, Bob 0x7ffd0c9b7570 : Person { name: "Bob", age: 20 }
[InFn] After : Alice 0x7ffd0c9b7568 : Person { name: "Bob", age: 20 }
[Main] After : Alice 0x7ffd0c9b77e0 : Person { name: "Bob", age: 20 } , Bob 0x7ffd0c9b7820 : Person { name: "Bob", age: 20 }
谁能解释一下原因?
【问题讨论】:
-
“这会改变我们的 person 变量所指向的内容,并且根本不会修改引用所指向的原始值” - 我很困惑,因为这是你的答案,
alice的内容没有改变,那为什么会在 main 中打印"Bob"?
标签: rust