我需要使用一个struct来保存serde_json对象,并在以后使用它。
extern crate serde_json;
use serde_json::builder::ObjectBuilder;
struct MyStruct {
builder: ObjectBuilder,
}
impl MyStruct {
fn new() -> MyStruct {
MyStruct { builder: ObjectBuilder::new() }
}
fn add_string_member(&self, name: &str, value: &str) {
self.builder.insert(name, value); //here compile error
}
}
fn main() {
let s = MyStruct::new();
s.add_string_member("name", "value");
}
但是我收到了错误
error: cannot move out of borrowed content [E0507]
答案 0 :(得分:0)
ObjectBuilder
中的方法按值self
获取。由于您无法从借用的指针中移出某些内容,因此简单的解决方案是使MyStruct
上的方法也按值self
获取。
此外,ObjectBuilder
的方法会返回带有更改的新ObjectBuilder
。您可以将该返回值包装到新的MyStruct
中,您可以从方法中返回。
extern crate serde_json;
use serde_json::builder::ObjectBuilder;
struct MyStruct {
builder: ObjectBuilder,
}
impl MyStruct {
fn new() -> MyStruct {
MyStruct { builder: ObjectBuilder::new() }
}
fn add_string_member(self, name: &str, value: &str) -> MyStruct {
MyStruct { builder: self.builder.insert(name, value) }
}
}
fn main() {
let s = MyStruct::new();
let s = s.add_string_member("name", "value");
}
如果MyStruct
还包含您要继续加入新MyStruct
的其他成员,则可以使用快捷语法初始化MyStruct
的其余字段现有实例:
fn add_string_member(self, name: &str, value: &str) -> MyStruct {
MyStruct { builder: self.builder.insert(name, value), ..self }
}
此处,新builder
的{{1}}字段将设置为指定的表达式,所有其他字段将从MyStruct
移出。 (self
语法接受任何正确类型的表达式,而不仅仅是..
。)