存储结构的引用并反序列化它们

Ale*_*ara 0 reference reference-type rust owned-types

我正在解析一个 toml 配置文件并将其内容检索到一些结构中,使用serdetoml

因此,配置结构可以定义如下:

#[derive(Deserialize, Debug)]
pub struct Config<'a> {
    #[serde(borrow)]
    pub server: Inner<'a>
}
Run Code Online (Sandbox Code Playgroud)

和另一个相关的:

#[derive(Deserialize, Debug)]
pub struct Inner<'a> {
    pub iprop1: &'a str,
    pub iprop2: &'a str,
}
Run Code Online (Sandbox Code Playgroud)

这是用于加载配置的 pub 接口:

pub fn load() -> Config<'static> {

    let config_file: String = fs::read_to_string(CONFIG_FILE_IDENTIFIER)
        .expect("Error opening or reading the configuration file");

    toml::from_str(config_file.as_str())
        .expect("Error generating the configuration")
}
Run Code Online (Sandbox Code Playgroud)

那么,问题就清楚了。我可以返回该函数拥有的数据load()

我可以将所有&str引用更改为String,因为我无法完全理解如何正确使用 Rust 中的引用,但我想知道,是否有另一种方法可以在 Rust 中使用生命周期验证这些引用,以便我的结构可以开始保存引用而不是拥有的值。

cdh*_*wie 5

参考文献是指其他地方拥有的数据。为此,所引用的数据必须至少与引用一样长,否则您将拥有对不再存在的数据的引用。

在您的load()函数中,返回类型声明Config将借用数据,即'static. 这是一个特殊的生命周期,指的是在程序的整个生命周期内有效的数据。

然而,toml::from_str()这里借用了config_file,它并不存在于程序的整个生命周期中。它只活到load()返回为止。您试图返回对本地函数拥有的数据的引用,这是不可能的,因为在使用返回的引用之前数据将被销毁。

如果没有其他地方可以config_file居住,那么数据确实应该归该Config结构所有。您表达这一点的方式是通过使用String而不是&str在该结构内。