Rust 使用结构文字更新语法时无法移出借用的内容:User{active:false,..*User}
我从Rust开始学习,我非常喜欢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
。
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您还需要使用户
可克隆,否则,您只能克隆引用,这是非常无用的。只需添加#[派生(克隆)]
,如示例所示。