"statics cannot evaluate destructors" 在 Rust 中

"statics cannot evaluate destructors" in Rust

我收到以下编译错误:

static optionsRegex: regex::Regex
    = match regex::Regex::new(r###"$(~?[\w-]+(?:=[^,]*)?(?:,~?[\w-]+(?:=[^,]*)?)*)$"###) {
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ statics cannot evaluate destructors
        Ok(r) => r,
        Default => panic!("Invalid optionsRegex")
};

更多详细信息:我需要访问编译后的正则表达式以供结构在创建时使用。感谢任何 Rust 文档链接或解释。

P.S。我想我明白 Rust 需要知道什么时候销毁它,但我不知道如何做到这一点,除了避免将其设为静态并在创建结构时每次需要时传递一些带有所有正则表达式的结构。

惰性初始化和安全地重新使用静态变量(例如正则表达式)是 once_cell crate 的主要用例之一。下面是一个验证正则表达式的示例,它只编译一次并在结构构造函数中重复使用:

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