首页 > 解决方案 > 提供带有生命周期的惰性静态引用

问题描述

是否可以提供带有生命周期参数的惰性静态?

use lazy_static::lazy_static; //lazy_static = "1.4.0"

enum MyEnum<'a>{
    Name(&'a str)
}

lazy_static! {
    static ref STATIC_ENUM: Mutex<MyEnum<'a>> = Mutex::new(MyEnum::Name("some name"));
}


给出:

error[E0261]: use of undeclared lifetime name `'a`
    static ref STATIC_ENUM: Mutex<MyEnum<'a>> = Mutex::new(MyEnum::Name("some name"));
                                           ^^ undeclared lifetime

标签: rust

解决方案


是的,但是您可以用于任何 static变量(惰性或非惰性)值的唯一生命周期是'static生命周期。

lazy_static! {
    static ref STATIC_ENUM: Mutex<MyEnum<'static>> = Mutex::new(MyEnum::Name("some name"));
}

如果您想输入&str不是文字(或故意泄露)的内容,这可能会出现问题。如果您需要这样做,可能您根本不应该使用引用,而是使用 own String,此时您的枚举不再需要生命周期参数:

enum MyEnum {
    Name(String),
}

另外,考虑使用once_cell::sync::Lazy而不是lazy_static::lazy_static. 它不会在这里给你任何特别的优势,但它不使用宏,因此它不会隐藏诸如static.


推荐阅读