static - 在 Rust 中给 lazy_static 一个正确的类型

标签 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)
    };
}

然后在 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(())
}

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

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`

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

如何赋予 LAND_POLYGONS 正确的类型,改为 geo::MultiPolygon?作为旁注,MultiPolygon 确实确实实现了 Debug

lazy_static 文档和示例使它看起来已经是这种情况,无需任何特殊操作。

注意:将以上所有内容放入一个 main.rs 文件时,结果是相同的。

最佳答案

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

将您的 println 语句更改为:

println!("{:?}", *LAND_POLYGONS);

关于static - 在 Rust 中给 lazy_static 一个正确的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50339314/

相关文章:

objective-c - 接口(interface)实现中静态变量的含义是什么?

c# - 可以在 C# 中跨多个对象锁定工作吗?

macros - rustc --pretty Expanded 在解析外部 block 内的宏扩展时使用我的所有 RAM

rust - "Conflicting requirements"作为参数传递给方法的迭代器项的生命周期

c - 局部变量不是静态的,但为什么会出现这种行为?

spring - Grails:使用 config.groovy 中定义的值初始化静态变量

php - PHP 中的静态初始值设定项或静态构造函数?

rust - 如何将Rust向量中的元素向右移动并将越界元素放在开始位置?

rust - 为什么 svd2rust 生成的一些寄存器函数使用 unsafe 而另一些则不使用?

multithreading - 如何在 Rust 中禁用并行执行?