无法移出共享引用后面的 ***

ner*_*ind 5 rust

我正在学习 Rust,我有一个关于如何将变量的引用传递给函数并使用它进行级联调用的问题。

我正面临以下代码中指出的错误:

struct User {
    name: String,
    address: String
}

// Argument "user" is intentionaly 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 intentionaly 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);
}
Run Code Online (Sandbox Code Playgroud)

为什么我不能这样做?我该怎么办?

我认为克隆 User 对象不是一种选择。想象一下,如果不是这个简单的结构,我们有一个可以占用几个 MBytes 的超级结构?

Mic*_*son 14

fn func1(user: &User)是一个借用现有 User 对象的函数,并承诺不修改它。fn func2(user: User)是一个函数,它获得一个对象的所有权并且永远不会把它归还。

Rust 阻止你做一些愚蠢的事情。有func1通话func2就像是看好我,你就借我的课堂笔记进行快速读取,然后将它传递给一个朋友,谁再逃跑,并让他们。你不可能把我的原件还给我。

解决方案是

  1. 也做个func2参考。这相当于让你的朋友答应把笔记还给你。然后你可以把它们还给我。
  2. 在传递到 之前克隆对象func2。这相当于你复制了笔记,让你的朋友拿着你的副本跑了——然后把我的原件还给我。

  • 注释类比确实清楚地解释了这个概念。谢谢。 (2认同)