rust - "statics cannot evaluate destructors"在 Rust

标签 rust static destructor

我收到以下编译错误:

static optionsRegex: regex::Regex
    = match regex::Regex::new(r###"$(~?[\w-]+(?:=[^,]*)?(?:,~?[\w-]+(?:=[^,]*)?)*)$"###) {
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ statics cannot evaluate destructors
        Ok(r) => r,
        Default => panic!("Invalid optionsRegex")
};
更多细节:我需要访问一个编译的正则表达式,以便在创建时供结构使用。任何 Rust 文档链接或解释表示赞赏。
附言我想我明白 Rust 需要知道何时销毁它,但我不知道如何制作它,只是避免将其设为静态并在每次创建结构时需要时传递一些带有所有正则表达式的结构。

最佳答案

延迟初始化和安全重用静态变量(例如正则表达式)是 once_cell 的主要用例之一。箱。下面是一个验证正则表达式的例子,它只编译一次并在结构体构造函数中重用:

use once_cell::sync::OnceCell;
use regex::Regex;

struct Struct;

impl Struct {
    fn new(options: &str) -> Result<Self, &str> {
        static OPTIONS_REGEX: OnceCell<Regex> = OnceCell::new();
        let options_regex = OPTIONS_REGEX.get_or_init(|| {
            Regex::new(r###"$(~?[\w-]+(?:=[^,]*)?(?:,~?[\w-]+(?:=[^,]*)?)*)$"###).unwrap()
        });
        if options_regex.is_match(options) {
            Ok(Struct)
        } else {
            Err("invalid options")
        }
    }
}
playground

关于rust - "statics cannot evaluate destructors"在 Rust,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65825406/

相关文章:

java - Android Studio 调用静态游戏资源绘制时出现 java.lang.ExceptionInInitializerError

c++ - 静态析构函数被提前调用

java - 为什么我们不能在静态方法中使用 'this' 关键字

c++ - 涉及类和结构的构造函数/析构函数

oop - MATLAB - 当涉及监听器时对象析构函数不运行

c++ - 当对象超出范围时是否调用析构函数?

macros - 如何在仅使用 rustc 进行代码分析的现有项目中获得与 Cargo 类似的依赖项解析?

rust - 如何在 Rust 1.12 的 read_line 中检查 EOF?

rust - 无法调用返回结果的函数:找到不透明类型 impl std::future::Future

rust - 如何使用 clokwerk 在调度程序上运行函数?