我有这段代码:
enum MyEnum1 {
val1,
val2
}
struct Struct1 {
field1: MyEnum1,
field2: String
}
fn fn1(a: Struct1, b: String, c: String) {
let let1 = fn2(&a.field1);
}
fn fn2(a: &MyEnum1) {
let a11 = *a; // error
let s = Struct1 { field1: a11, field2: "fdsfds".to_string() };
}
fn main() {
println!("Hello World!");
}
错误是错误:无法移出借来的内容
编译器建议我使用ref
或ref mut
,我尝试使用它们但仍然无效。
fn fn2(a: &MyEnum1) {
let ref a11 = *a; // still the error
let s = Struct1 { field1: *a11, field2: "fdsfds".to_string() };
}
答案 0 :(得分:3)
函数fn2
作为参数收到{em>引用 MyEnum1
,但Struct1
包含拥有的 {{ 1}}。这意味着您实际上是在尝试将引用转换为拥有值,这只有在您复制数据时才有可能。
如果MyEnum1
实施了MyEnum1
特征(后者需要实施Copy
特征),您的代码就会有用。如果类型实现Clone
,则在取消引用它时以及分配它时将自动复制它(例如,标准库中的Copy
类型实现i32
)。尝试以下内容:
Copy
您也可以选择仅实现#[derive(Clone, Copy)]
enum MyEnum1 {
val1,
val2
}
并明确克隆该对象,以防您的数据结构复制成本高昂(例如,标准库中的Clone
结构实现{{1}但不是String
)。然后,您需要使用以下代码:
Clone
最后,您还可以选择按值传递Copy
,而不是按引用传递。然后,您需要应用的唯一更改是:
#[derive(Clone)]
enum MyEnum1 {
val1,
val2
}
fn fn2(a: &MyEnum1) {
let s = Struct1 { field1: a.clone(), field2: "fdsfds".to_string() };
}