gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:01:56 26 4
gpt4 key购买 nike

我想使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com