Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 修复使用lazy_static时serde生存期问题_Rust_Serde - Fatal编程技术网

Rust 修复使用lazy_static时serde生存期问题

Rust 修复使用lazy_static时serde生存期问题,rust,serde,Rust,Serde,我想将一些json读入静态HashMap,并使用lazy_static和serde,但我不知道如何解决serde的生存期问题: #[macro_use] extern crate lazy_static; use std::fs::File; use std::io::BufReader; use std::collections::HashMap; lazy_static! { static ref KEYWORDS: HashMap<&'static str, i32

我想将一些json读入静态HashMap,并使用lazy_static和serde,但我不知道如何解决serde的生存期问题:

#[macro_use]
extern crate lazy_static;
use std::fs::File;
use std::io::BufReader;
use std::collections::HashMap;

lazy_static! {
    static ref KEYWORDS: HashMap<&'static str, i32> = {
        let file = File::open("words.json").unwrap();
        let reader = BufReader::new(file);
        serde_json::from_reader(reader).unwrap()
    };
}

错误:serde::de::反序列化的实现不够通用
注意:HashMap必须实现serde::de::Deserialize错误消息告诉您不能反序列化到&'static str。随着反序列化程序继续创建条目,&str键的生存期只能与反序列化程序读取文件的缓冲区的借用一样长。但是&'static str必须指向一个永远存在的str

我在这里看到两种解决方案:简单的方法和困难的方法

简单的方法是:只需将类型中的&'static str更改为String,它就可以编译了。这样HashMap就拥有了密钥;serde已经知道如何反序列化拥有的字符串

静态引用关键字:HashMap={/。。。 困难之处:从技术上讲,您仍然可以获得HashMap&静态str{ Box::leakfrom.into_boxed_str }
问题是serde不会自动执行此操作。实现此操作的一种方法是首先反序列化到HashMap,然后将其转换为HashMap错误消息告诉您不能反序列化到&'static str。随着反序列化程序创建条目,&str键的生存期可能只有反序列化程序正在将文件读入的缓冲区的借用。但是&'static str必须指向永久存在的str

我在这里看到两种解决方案:简单的方法和困难的方法

简单的方法是:只需将类型中的&'static str更改为String,它就可以编译了。这样HashMap就拥有了密钥;serde已经知道如何反序列化拥有的字符串

静态引用关键字:HashMap={/。。。 困难之处:从技术上讲,您仍然可以获得HashMap&静态str{ Box::leakfrom.into_boxed_str } 问题是serde不会自动执行此操作。实现此操作的一种方法是首先反序列化到HashMap,然后将其转换为HashMap罪魁祸首是serde_json::from_reader是如何定义的。from:

pub fn from_readerrdr:R->Result where R:读一下, T:反序列化拥有, 因此,结果必须是自有数据,而不是借用数据。即使是&'static也不行。您必须在此处使用字符串:

懒惰的人{ 静态引用关键字:HashMap={ 让file=file::openwords.json.unwrap; 让reader=BufReader::newfile; serde_json::from_readerreader.unwrap }; } 这里的罪魁祸首是如何定义serde_json::from_reader。from:

pub fn from_readerrdr:R->Result where R:读一下, T:反序列化拥有, 因此,结果必须是自有数据,而不是借用数据。即使是&'static也不行。您必须在此处使用字符串:

懒惰的人{ 静态引用关键字:HashMap={ 让file=file::openwords.json.unwrap; 让reader=BufReader::newfile; serde_json::from_readerreader.unwrap }; } 使用serde_json::from_str从&str反序列化时⟶ HashMap,输入JSON字符串需要比输出中的字符串片段更有效。这是签名中的“生命周期”角色:

这意味着,如果输出需要包含具有“static life”的字符串片段,那么输入JSON数据也必须具有“static life”。我们知道如何做到这一点-lazy_static

use lazy_static::lazy_static;
use std::collections::HashMap;

lazy_static! {
    static ref KEYWORDS: HashMap<&'static str, i32> = {
        lazy_static! {
            static ref WORDS_JSON: String = {
                std::fs::read_to_string("words.json").unwrap()
            };
        }
        serde_json::from_str(&WORDS_JSON).unwrap()
    };
}
使用serde_json::from_str从&str反序列化时⟶ HashMap,输入JSON字符串需要比输出中的字符串片段更有效。这是签名中的“生命周期”角色:

这意味着,如果输出需要包含具有“static life”的字符串片段,那么输入JSON数据也必须具有“static life”。我们知道如何做到这一点-lazy_static

use lazy_static::lazy_static;
use std::collections::HashMap;

lazy_static! {
    static ref KEYWORDS: HashMap<&'static str, i32> = {
        lazy_static! {
            static ref WORDS_JSON: String = {
                std::fs::read_to_string("words.json").unwrap()
            };
        }
        serde_json::from_str(&WORDS_JSON).unwrap()
    };
}

你也可以使用一个盒子作为键,它的内存布局与&str相同。你也可以使用一个盒子作为键,它的内存布局与&str相同。这太神奇了