相关疑难解决方法(0)

变量绑定:移动&mut或借用指示物?

此代码在let c = a;编译错误"使用移动值:a"时按预期失败:

fn main() {
    let a: &mut i32 = &mut 0;
    let b = a;
    let c = a;
}
Run Code Online (Sandbox Code Playgroud)

a被移入b并且不再可用于c的赋值.到现在为止还挺好.

但是,如果我只注释其b类型并将其他所有内容留下:

fn main() {
    let a: &mut i32 = &mut 0;
    let b: &mut i32 = a;
    let c = a;
}
Run Code Online (Sandbox Code Playgroud)

代码再次失败 let c = a;

但这一次有一个非常不同的错误信息:"不能搬出去,a因为它是借来的......借来的*a发生在这里:let b: &mut i32 = a;"

所以,如果我只是注释b的类型:没有a进入b,而是一个"重新"的借用*a

我错过了什么?

干杯.

rust

13
推荐指数
1
解决办法
641
查看次数

可变引用有移动语义吗?

fn main() {
    let mut name = String::from("Charlie");
    let x = &mut name;
    let y = x;       // x has been moved
    say_hello(y);
    say_hello(y);       // but y has not been moved, it is still usable
    change_string(y);
    change_string(y);  

}

fn say_hello(s: &str) {
    println!("Hello {}", s);
}

fn change_string(s: &mut String) {
    s.push_str(" Brown");
}
Run Code Online (Sandbox Code Playgroud)

当我分配xy x已被移动。但是,当我在函数中使用它时,我希望可以移动具有移动语义的东西。但是,我仍然可以在后续调用后使用参考。也许这与 say_hello() 接受不可变引用有关,但 change_string() 接受可变引用但引用仍未移动。

ownership rust borrow-checker

11
推荐指数
1
解决办法
452
查看次数

标签 统计

rust ×2

borrow-checker ×1

ownership ×1