我收到以下编译错误:
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/