rust 无法移出位于共享引用后面的 *[重复]

jdgnovmf  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(115)

此问题已在此处有答案

Cannot move out of borrowed content / cannot move out of behind a shared reference(2个答案)
两年前关闭。
我正在学习Rust,我有一个关于如何将变量的引用传递给函数并使用它进行级联调用的问题。
我面临的错误指示在下面的代码:

struct User {
    name: String,
    address: String
}

// Argument "user" is intentionally a reference to User struct;
//
fn func1(user: &User) {
    println!("func1: {}, {}", user.name, user.address);

    // error[E0507]: cannot move out of `*user` which is behind a shared reference
    //
    func2(*user);
}

// Argument "user" is intentionally an instance of User struct;
//
fn func2(user: User) {
    println!("func2: {}, {}", user.name, user.address);
}

fn main() {
    let user = User {
        name: String::from("George"),
        address: String::from("Main Street")
    };

    func1(&user);
}

为什么我不能这么做?我该怎么办?
我认为克隆User对象不是一种选择。想象一下,如果不是这个简单的结构,我们有一个超级结构,可以占用几兆字节?

ruarlubt

ruarlubt1#

fn func1(user: &User)是一个借用现有User对象的函数,承诺不修改它。fn func2(user: User)是一个获取对象所有权且从不归还的函数。
生 rust 是阻止你做一些愚蠢的事情。让func1调用func2就像答应我,你会借我的课堂笔记快速阅读,然后把它交给朋友,然后他就跑了并保留了它们。你不可能把我的原件还给我。
解决办法是
1.让func2也参考一下。这相当于让你的朋友答应把笔记还给你。你可以把它们还给我。
1.在传递给func2之前克隆对象。这就相当于你复印了一份笔记,让你的朋友带着你的笔记跑了--然后把原件还给我。

相关问题