rust - 为什么 `Regex::new` 的结果不能分配给常量?
问题描述
我有许多重复的常量,形式如下:
pub const FOO_REGEX: Regex = Regex::new(r"foo.*").unwrap();
pub const BAR_REGEX: Regex = Regex::new(r"bar.*").unwrap();
我想通过使用macro_rules!
宏来简单地做到这一点。
我试过了:
macro_rules! pattern {
($value:literal) => {
Regex::new($value).unwrap()
}
}
pub const FOO_REGEX: Regex = pattern!(r"foo.*");
但是编译器抱怨:
error[E0015]: calls in constants are limited to constant functions, tuple structs and tuple variants
--> lib.rs:7:9
|
7 | Regex::new($value).unwrap()
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
...
11 | pub const FOO_REGEX: Regex = pattern!(r"foo.*");
| ------------------ in this macro invocation
根据本指南,我尝试了许多可用的指示符选项,例如expr
, ident
,但我仍然无法编译宏。
为什么literal
指示符不适用于此宏表达式?
解决方案
这与宏无关:如果您直接编写代码(操场),则会得到相同的错误。这里的问题是调用Regex::new
不是文字 (1) 并且不能在编译时进行评估 (还没有? )。您将需要使用类似lazy_static
crate 的东西来确保Regex::new
在运行时调用它来编译正则表达式:
use regex::Regex;
use lazy_static::lazy_static;
lazy_static!{
pub static ref FOO_REGEX: Regex = Regex::new(r"foo.*").unwrap();
}
(1)引用这个答案:
文字是在代码中按原样
true
写入的值: ,1
,"hello"
; 表达式 [likeRegex::new
]的结果不能是文字(根据定义)。结果类型可能看起来相似(甚至相同),但类型在这里无关紧要。
推荐阅读
- ios - 关于单元格高度更新问题的静态 UITableViewCell 动画中的 UIPickerView
- java - 从终端输入转义反斜杠
- php - 如何从 WordPress php 的更改中排除管理员?
- html - 如何使图像适合幻灯片的容器?
- html - SASS 使用屏幕高度计算设置高度 div 后剩余的 vh
- excel - 将枚举类型的调用构造为字符串并在 VBA 中的 Evaluate 函数中使用
- python - 运行 Python 代码时的另一个回溯错误
- powershell - 获取 NetConnectionProfile IPv4Connectivity 参数
- google-cloud-platform - 如何安排任务调用 gRPC 方法?
- node.js - 在 express 中使用 jest 测试重定向