Rust 使用结构文字更新语法时无法移出借用的内容:User{active:false,..*User}

Rust 使用结构文字更新语法时无法移出借用的内容:User{active:false,..*User},rust,Rust,我从Rust开始学习,我非常喜欢。to的语法,但我不知道如何将其用于实例引用 这给了我一个错误: 错误[E0507]:无法移出借用的内容 -->src/main.rs:24:11 | 24 |…*用户 |^^^^无法移出借用的内容 有趣的是,它在某个时候对我起了作用: fn reduce<'a>(state: &State<'a>, action: Action) -> Option<State<'a>> { match

我从Rust开始学习,我非常喜欢
to的语法,但我不知道如何将其用于实例引用

这给了我一个错误:

错误[E0507]:无法移出借用的内容
-->src/main.rs:24:11
|
24 |…*用户
|^^^^无法移出借用的内容
有趣的是,它在某个时候对我起了作用:

fn reduce<'a>(state: &State<'a>, action: Action) -> Option<State<'a>> {
    match action {
        Action::LoadRoms { roms } => {
            let mut new_state = State { roms, ..*state };
            Some(new_state)
        }
        _ => None,
    }
}

fn reduce,action:action)->OptionThe
.expr
语法将所有缺少的成员从
expr
移动。它在移动。这意味着您通常不能将其与引用一起使用,因为您不能移出引用(但您可以“移动”
Copy
types移出引用)

要解决此问题,您需要克隆,以便获得可以从中移动的新完整对象:

fn foo(user: &User) -> User {
    User {
        active: false,
        ..user.clone()
    }
}
()

缺点是,这也会克隆您不需要的所有成员,因为您已经指定了它们。在这种情况下,克隆
active
是一个很简单的操作(因为它只是一个布尔值),因此没有问题,但是这会使
用户名的克隆变得多余无用:

fn foo(user: &User) -> User {
    User {
        username: "foo".into(),
        ..user.clone()
    }
}

.expr
语法从
expr
移动所有缺少的成员。它在移动。这意味着您通常不能将其与引用一起使用,因为您不能移出引用(但您可以“移动”
Copy
types移出引用)

要解决此问题,您需要克隆,以便获得可以从中移动的新完整对象:

fn foo(user: &User) -> User {
    User {
        active: false,
        ..user.clone()
    }
}
()

缺点是,这也会克隆您不需要的所有成员,因为您已经指定了它们。在这种情况下,克隆
active
是一个很简单的操作(因为它只是一个布尔值),因此没有问题,但是这会使
用户名的克隆变得多余无用:

fn foo(user: &User) -> User {
    User {
        username: "foo".into(),
        ..user.clone()
    }
}

好的,谢谢。。。。但是。。。为什么它会在某个时候起作用?XD这让人困惑me@Cecile它在第二个示例中起作用,因为
roms
State
的唯一非
Copy
成员,并且
roms
是您要替换的元素,因此不需要移动它。在
struct
update语法中,仅移动未显式设置的字段。(如果您在
状态
中添加了另一个非
复制
的字段,它将出现与
用户
相同的问题。)感谢您的解释克隆不起作用,我仍然获得一个参考:`=注意:预期类型用户找到类型和用户`@Cecile您还需要使
用户
可克隆,否则,您只能克隆引用,这是非常无用的。只需添加
#[派生(克隆)]
,如游乐场示例所示。Ok有意义,谢谢。。。。但是。。。为什么它会在某个时候起作用?XD这让人困惑me@Cecile它在第二个示例中起作用,因为
roms
State
的唯一非
Copy
成员,并且
roms
是您要替换的元素,因此不需要移动它。在
struct
update语法中,仅移动未显式设置的字段。(如果您在
状态
中添加了另一个非
复制
的字段,它将出现与
用户
相同的问题。)感谢您的解释克隆不起作用,我仍然获得一个参考:`=注意:预期类型用户找到类型和用户`@Cecile您还需要使
用户
可克隆,否则,您只能克隆引用,这是非常无用的。只需添加
#[派生(克隆)]
,如示例所示。