Rust的struct如何保存和使用对象?

时间:2016-03-14 08:50:18

标签: rust

我需要使用一个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]

1 个答案:

答案 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语法接受任何正确类型的表达式,而不仅仅是..。)