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