类型推断和借用 vs 所有权转移
Type inference and borrowing vs ownership transfer
我正在学习 Rust,但我 运行 遇到了一些令人困惑的行为。以下代码编译正常并按预期工作(编辑:添加了测试函数以外的代码,之前已省略):
struct Container<'a> {
contents : &'a mut i32,
}
fn main() {
let mut one = Container { contents: &mut 5 };
test(&mut one);
println!("Contents: {}",one.contents);
}
fn test<'a>(mut x : &'a mut Container) {
*x.contents += 1;
let y = x;
*y.contents += 1;
x = y;
println!("{:?}",*x.contents)
}
现在在声明中
let y = x;
推断类型。因为 x
是 &'a mut Container
类型,我认为这等价于:
let y: &'a mut Container = x;
但是当我这样做时,编译器出现问题:
test_3.rs:25:5: 25:10 error: cannot assign to `x` because it is borrowed
test_3.rs:25 x = y;
^~~~~
test_3.rs:23:33: 23:34 note: borrow of `x` occurs here
test_3.rs:23 let y: &'a mut Container = x;
在正确工作的示例中,x
怎么没有被那个点借用?我通过从正确工作的版本中省略行 x = y;
进行测试,编译器说:
test_3.rs:24:13: 24:14 note: `x` moved here because it has type `&mut Container<'_>`, which is moved by default
因此,当我没有明确定义类型时,我会采取行动,否则会借用。发生了什么,我如何在显式指定类型的同时获得与以前相同的行为,以及在一种情况下导致移动行为但在另一种情况下借用的原因?
编辑完整程序
当你这样做时
let y = x;
发生了一个动作。 x
被清空,可以说,所有权转移到 y
。
当您执行以下任一操作时
let y: &mut _ = x;
let y: &'a mut _ = x;
x
被重新借用以帮助匹配生命周期。这大致转化为
let y: &mut _ = &mut *x;
let y: &'a mut _ = &mut *x;
这使得 x
非空,持有别名可变借用。因此分配给它必须等待 y
被销毁。或者,您可以预先移动它
let tmp = x;
let y: &'a mut _ = tmp;
我承认这是不明显的行为,遗憾的是你不能在不借用整个值的情况下借用值的内容。
我正在学习 Rust,但我 运行 遇到了一些令人困惑的行为。以下代码编译正常并按预期工作(编辑:添加了测试函数以外的代码,之前已省略):
struct Container<'a> {
contents : &'a mut i32,
}
fn main() {
let mut one = Container { contents: &mut 5 };
test(&mut one);
println!("Contents: {}",one.contents);
}
fn test<'a>(mut x : &'a mut Container) {
*x.contents += 1;
let y = x;
*y.contents += 1;
x = y;
println!("{:?}",*x.contents)
}
现在在声明中
let y = x;
推断类型。因为 x
是 &'a mut Container
类型,我认为这等价于:
let y: &'a mut Container = x;
但是当我这样做时,编译器出现问题:
test_3.rs:25:5: 25:10 error: cannot assign to `x` because it is borrowed
test_3.rs:25 x = y;
^~~~~
test_3.rs:23:33: 23:34 note: borrow of `x` occurs here
test_3.rs:23 let y: &'a mut Container = x;
在正确工作的示例中,x
怎么没有被那个点借用?我通过从正确工作的版本中省略行 x = y;
进行测试,编译器说:
test_3.rs:24:13: 24:14 note: `x` moved here because it has type `&mut Container<'_>`, which is moved by default
因此,当我没有明确定义类型时,我会采取行动,否则会借用。发生了什么,我如何在显式指定类型的同时获得与以前相同的行为,以及在一种情况下导致移动行为但在另一种情况下借用的原因?
编辑完整程序
当你这样做时
let y = x;
发生了一个动作。 x
被清空,可以说,所有权转移到 y
。
当您执行以下任一操作时
let y: &mut _ = x;
let y: &'a mut _ = x;
x
被重新借用以帮助匹配生命周期。这大致转化为
let y: &mut _ = &mut *x;
let y: &'a mut _ = &mut *x;
这使得 x
非空,持有别名可变借用。因此分配给它必须等待 y
被销毁。或者,您可以预先移动它
let tmp = x;
let y: &'a mut _ = tmp;
我承认这是不明显的行为,遗憾的是你不能在不借用整个值的情况下借用值的内容。