类型推断和借用与所有权转移

记住我的话

我正在学习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是type &'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;

我承认这是不明显的行为,而且很遗憾您不能在不借用整个价值的情况下借用价值的内容。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章