【问题标题】:How to use struct update syntax with immutable borrow?如何使用带有不可变借用的结构更新语法?
【发布时间】:2022-09-25 10:38:47
【问题描述】:

使用 struct update 语法创建 struct 实例时出现错误:

struct User {
    username: String,
    email: String,
    active: bool,
    sign_in_count: u64,
}

fn create_user(username: &str, email: &str) -> User {
    User {
        username: username.to_string(),
        email: email.to_string(),
        active: true,
        sign_in_count: 1,
    }
}

fn create_user_from_template(username: &str, email: &str, user: &User) -> User {
    User {
        username: username.to_string(),
        email: email.to_string(),
        ..user
    }
}

fn print_user(user: &User) {
    println!(\"username: {}, email: {}\", user.username, user.email);
}

fn main() {
    let user1 = create_user(\"abcd\", \"abcd@gmail.com\");
    print_user(&user1);
    let user2 = create_user_from_template(\"xyz\", \"xyz@gmail.com\", &user1);
    print_user(&user2);
}
error[E0308]: mismatched types
  --> src/main.rs:21:11
   |
21 |         ..user
   |           ^^^^ expected struct `User`, found `&User`

For more information about this error, try `rustc --explain E0308`.

这可能吗?我需要做什么?

    标签: rust


    【解决方案1】:

    user 是作为对 create_user_from_template 函数的引用传入的(作为 &User 类型),因此您只需取消引用它:..*user

    【讨论】:

    • 这只有在用户是Copy 时才有效,对吗?
    • 我来自 C++ 背景,所以如果我需要取消引用,是否意味着我必须使用 -> 语法来访问 struct 的字段。
    • @mousetail 用户不需要,但我认为它提取的字段可以,因为 Rust 只能复制/移动结构的所需部分
    • @Harry 不,Rust 具有某些自动取消引用规则,因此您可以继续使用 . 运算符,并且它将能够以与 -> 在 C++ 中的工作方式相同的方式处理它。从字面上看,只需在user 前面添加* 即可。实际上,我对没有自动引用感到有些惊讶。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 2015-08-10
    • 2015-10-16
    • 2018-02-02
    • 2022-01-04
    相关资源
    最近更新 更多