在 Rust 中为 lazy_static 赋予正确的类型

Jiv*_*van 1 static rust

我有这个文件utils.rs声明lazy_static如下:

extern crate geojson;
extern crate geo;

use self::geo::MultiPolygon;
use self::geojson::GeoJson;
use self::geojson::conversion::TryInto;

lazy_static! {
    pub static ref LAND_POLYGONS: MultiPolygon<f64> = {
        let input_string = include_str!("resources/land.geojson");
        let mut polygons: Vec<Polygon<f64>> = vec![];
        // ...
        // add some polygons here
        // ...
        MultiPolygon(polygons)
    };
}
Run Code Online (Sandbox Code Playgroud)

然后在main.rs我尝试使用LAND_POLYGONS如下:

#[macro_use]
extern crate lazy_static;

extern crate geo;

use self::geo::MultiPolygon;
use utils::LAND_POLYGONS;

fn main() -> Result<(), Box<Error>> {
    lazy_static::initialize(&LAND_POLYGONS);
    println!("{:?}", LAND_POLYGONS);

    Ok(())
}
Run Code Online (Sandbox Code Playgroud)

这会产生以下编译器错误:

error[E0277]: `utils::LAND_POLYGONS` doesn't implement `std::fmt::Debug`
  --> src/main.rs:30:22
   |
30 |     println!("{:?}", LAND_POLYGONS);
   |                      ^^^^^^^^^^^^^ `utils::LAND_POLYGONS` cannot be formatted using `:?`; add `#[derive(Debug)]` or manually implement `std::fmt::Debug`
   |
   = help: the trait `std::fmt::Debug` is not implemented for `utils::LAND_POLYGONS`
   = note: required by `std::fmt::Debug::fmt`
Run Code Online (Sandbox Code Playgroud)

似乎LAND_POLYGONS是作为其自己类型的实例加载的。

如何给出LAND_POLYGONS它的正确类型,而geo::MultiPolygon不是一个?作为旁注,MultiPolygon确实确实实现了Debug.

lazy_static文档和例子使它看起来像这会已经没有什么特别做的情况。

注意:当将以上所有内容放在一个main.rs文件中时,结果是一样的。

jus*_*nas 6

在幕后,lazy_static 生成一个一次性结构类型,其Deref实现为您提供对您指定的类型的实际值的引用。

将您的println声明更改为:

println!("{:?}", *LAND_POLYGONS);
Run Code Online (Sandbox Code Playgroud)