【问题标题】:How to use a once_cell::sync::Lazy in another once_cell::sync::Lazy?如何在另一个 one_cell::sync::Lazy 中使用 once_cell::sync::Lazy?
【发布时间】:2021-12-22 05:57:18
【问题描述】:

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

示例代码如下:

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

【问题讨论】:

    标签: rust synchronization lazy-initialization


    【解决方案1】:

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

    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,你可以只使用&amp;*。或者,如果您想更明确一些,可以使用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,
        ]
    });
    

    【讨论】:

    • 在 KINDS 惰性向量中存储引用应该对我有用,谢谢!
    猜你喜欢
    • 2016-06-21
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    相关资源
    最近更新 更多