gpt4 book ai didi

rust - 为什么 `Regex::new`的结果不能分配给常量?

转载 作者:行者123 更新时间:2023-12-03 11:42:05 25 4
gpt4 key购买 nike

我有以下形式的许多重复常量:

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

对于 this guide,我尝试了许多可用的指示符选项,例如 exprident,但是我仍然无法获取宏来进行编译。

为什么 literal指示符对此宏表达式不起作用?

最佳答案

这与宏无关:如果直接编写代码(playground),则会遇到相同的错误。这里的问题是,调用Regex::new并非文字(1),并且无法在编译时进行评估(yet?)。您将需要使用诸如 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();
}

Playground

(1)this answer引用:

A literal is a value written as-is in the code: true, 1, "hello"; the result of an expression [like Regex::new] cannot be a literal (by definition). The resulting types may look similar (or even be identical) but types are irrelevant here.

关于rust - 为什么 `Regex::new`的结果不能分配给常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59170011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com