rust - 如何在另一个 once_cell::sync::Lazy 中使用 once_cell::sync::Lazy?

标签 rust synchronization lazy-initialization

我想使用 Rust 和 once_cell实现一些静态常量结构实例,一个静态常量向量包含这些静态结构实例。

示例代码如下:

use once_cell::sync::Lazy;

pub struct Kind {
  name: String,
  value: i32,
}

impl Kind {
  pub fn new(name: &str, value: i32) -> Kind {
    Kind {name: String::from(name), value}
  }
}

const HYBRID: Lazy<Kind> = Lazy::new(|| Kind::new("a", 1));
const BOND: Lazy<Kind> = Lazy::new(|| Kind::new("b", 2));
// other instances

static KINDS: Lazy<Vec<Kind>> = Lazy::new(|| {
  vec![
    HYBRID,
    BOND,
    // other instances,
  ]
});

这是编译器错误:

error[E0308]: mismatched types
  --> src/quant/fund/data/fund_info.rs:50:9
   |
50 |         HYBRID,
   |         ^^^^^^ expected struct `Kind`, found struct `once_cell::sync::Lazy`
   |
   = note: expected struct `Kind`
              found struct `once_cell::sync::Lazy<Kind>`

我应该如何在 Lazy 中获得真正的 Kind

最佳答案

一个选择就是在那里创建它们:

static KINDS: Lazy<Vec<Kind>> = Lazy::new(|| {
    vec![
        Kind::new("a", 1),
        Kind::new("b", 2),
        // other instances,
    ]
});

但是上述方法不允许您使用它们的静态值单独使用这些值。如果你确实想这样做,你可以存储引用(注意你应该使用 static 而不是 const 作为值,参见 What is the difference between a constant and a static variable and which should I choose? )。因为Lazy impls Deref,你可以只使用&*。或者你可以使用 Lazy::force()如果你想更明确。

static HYBRID: Lazy<Kind> = Lazy::new(|| Kind::new("a", 1));
static BOND: Lazy<Kind> = Lazy::new(|| Kind::new("b", 2));
// other instances

static KINDS: Lazy<Vec<&Kind>> = Lazy::new(|| {
    vec![
        Lazy::force(&HYBRID),
        &*BOND,
        // other instances,
    ]
});

或者,如果您需要拥有的值,请克隆它们:

#[derive(Clone)]
pub struct Kind { /* ... */ }

static HYBRID: Lazy<Kind> = Lazy::new(|| Kind::new("a", 1));
static BOND: Lazy<Kind> = Lazy::new(|| Kind::new("b", 2));
// other instances

static KINDS: Lazy<Vec<Kind>> = Lazy::new(|| {
    vec![
        HYBRID.clone(),
        BOND.clone(),
        // other instances,
    ]
});

关于rust - 如何在另一个 once_cell::sync::Lazy 中使用 once_cell::sync::Lazy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70444807/

相关文章:

type-conversion - From 和 Into 特征以及 usize 到 f64 的转换

java - Java : pattern or anti-pattern? synchronized 的混淆使用

swift - 属性初始值设定项在 'self' 可用之前运行

java - Initialize-On-Demand 习语与单例实现中的简单静态初始化程序

c# - 不使用空合并运算符进行延迟初始化有什么好的理由吗?

rust - Rust 中 'mut' 关键字的用法

data-structures - 用另一种数据结构在Rust中初始化数据结构的字段

rust - 可变和不可变数据访问

c# - 我应该*总是*同步访问从多个线程使用的所有双字段/属性/变量吗?

ios - CloudKit:CKFetchRecordChangesOperation、CKServerChangeToken 和 Delta 下载