如何用堆引用惯用构造struct?

lat*_*sis 7 rust

所以我目前难以struct通过将Yaml文件加载到堆内存来初始化:

extern crate yaml_rust;

use std::io::prelude::*;
use std::fs;
use yaml_rust::{Yaml, YamlLoader};

struct Petrovich {
    middlename: Yaml,
    firstname: Yaml,
    lastname: Yaml
}

impl  Petrovich {

    fn new() -> Petrovich {

        // Open Rules File (Panics on error)
        let mut f = fs::File::open("./src/rules.yml").unwrap();
        // Create String Buffer and Read to it
        let mut buffer = String::new();
        f.read_to_string(&mut buffer).unwrap();
        // Pass Buffer to Yaml and unwrap
        let rules: &Yaml = &YamlLoader::load_from_str(&buffer).unwrap()[0];

        // Return Petrovich with preloaded rules
        Petrovich { 
            middlename: rules["middlename"],
            firstname: rules["firstname"],
            lastname: rules["lastname"]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我得到一个cannot move out of indexed content错误.我该如何解决这个问题?

编辑:我使用yaml-rust了这一点,并有一个文件rules.ymlfirstname,lastnamemiddlename领域内,包括./src

来源可以在这里找到:https://github.com/Latrasis/petrovich-rs

tre*_*tcl 2

YamlClone,因此您可以简单地在引用上调用 .clone() 来将其内容复制“出来”:

    Petrovich { 
        middlename: rules["middlename"].clone(),
        firstname: rules["firstname"].clone(),
        lastname: rules["lastname"].clone(),
    }
Run Code Online (Sandbox Code Playgroud)

我更喜欢这个而不是公认的解决方案,因为复制的数据很小并且它不依赖于yaml::Hash. 克隆整个文档树可能是另一回事。

您可能会在这里争论是否要向 yaml-rust 添加某个功能。将元素移出树似乎是一个合理的请求,但 API 并不直接支持它。