我构建了这个代码示例,它的效果看似不一致,什么是/不被视为移动,因此/是/不允许在 Rust 中编译。
struct Foo {
bar: String,
bazs: Vec<String>,
}
fn main() {
let a: Foo = Foo {
bar: "bar".to_string(),
bazs: vec!["baz_1".to_string(), "bax_2".to_string()],
};
let b: String = a.bar;
println!{"Who owns the String value, variable a or b? {b}"};
// assigning a String (from a field of String type) to b IS NOT considered a move
// assigning a String (from an element of field of Vec<String> type to IS considered a move
// let c: String = a.bazs[0];
}
该示例基于对《Rust 编程语言》一书的阅读,与讨论字符串移动的 ss 部分相关,但尚未提供足够的推理来让我理解这个构造的示例:
我希望得到一些关于如何正确理解这个问题的指导。
Rust 有部分动作。您可以将
a.bar
和 a.bazs
分别移出 a
。您不能做的是在移出任何(非 a
)字段后完整使用 Copy
。但个别未移动的领域仍然是公平的游戏。所以这很好:
let a: Foo = Foo {
bar: "bar".to_string(),
bazs: vec!["baz_1".to_string(), "bax_2".to_string()],
};
let b = a.bar;
let bazs = a.bazs;
虽然这不是:
let a: Foo = Foo {
bar: "bar".to_string(),
bazs: vec!["baz_1".to_string(), "bax_2".to_string()],
};
let b = a.bar;
let new_a = a;
你会看到的
error[E0382]: use of partially moved value: `a`
partial move occurs because `a.bar` has type `std::string::String`,
which does not implement the `Copy` trait