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

标签 rust

这个问题在这里已经有了答案:





Cannot move out of borrowed content / cannot move out of behind a shared reference

(1 个回答)


12 个月前关闭。




我正在学习 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);
}

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

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

最佳答案

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

Rust 阻止你做一些愚蠢的事情。有 func1调用 func2就像向我保证你会借我的类笔记快速阅读,然后将其传递给一个 friend ,然后他会跑掉并保留它们。你不可能把我的原件还给我。

解决方案是

  • 制作 func2也引用一下。这相当于让你的 friend 答应把笔记还给你。然后你可以把它们还给我。
  • 在传递给 func2 之前克隆对象.这相当于你复制了笔记,让你的 friend 拿着你的副本跑了——然后把我的原件还给我。
  • 关于rust - 无法移出共享引用后面的 ***,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61995143/

    相关文章:

    rust - 在 Rust 闭包中重用绑定(bind)

    rust - 如何在 Rust 中打印没有尾随换行符的输出?

    rust - 可选择将项目推送到 Vec 或返回现有项目

    rust - Rust 中的多行字符串,保留前导空格

    rust - 为迭代其 HashMap 属性的结构实现 IntoIterator

    rust - 为什么这个 rppal I2c 结构没有任何方法?

    struct - 何时使用引用或框来拥有实现结构中特征的字段?

    file-upload - 使用 actix-web-Framework 在 Rust 中的网络服务器上上传文件时使用原始文件名保存文件

    Rust:保持相同帧速率的宏不起作用

    rust - 如何创建具有泛型类型参数的函数向量?