Как сделать скомпилированный Regexp глобальной переменной?

У меня есть несколько регулярных выражений, которые определены во время выполнения, и я хотел бы сделать их глобальными переменными.

Чтобы дать вам представление, работает следующий код:

use regex::Regex; // 1.1.5

fn main() {
    let RE = Regex::new(r"hello (\w+)!").unwrap();
    let text = "hello bob!\nhello sue!\nhello world!\n";
    for cap in RE.captures_iter(text) {
        println!("your name is: {}", &cap[1]);
    }
}

Но я бы хотел, чтобы это было примерно так:

use regex::Regex; // 1.1.5

static RE: Regex = Regex::new(r"hello (\w+)!").unwrap();

fn main() {
    let text = "hello bob!\nhello sue!\nhello world!\n";
    for cap in RE.captures_iter(text) {
        println!("your name is: {}", &cap[1]);
    }
}

Однако я получаю следующую ошибку:

error[E0015]: calls in statics are limited to constant functions, tuple structs and tuple variants
 --> src/main.rs:3:20
  |
3 | static RE: Regex = Regex::new(r"hello (\w+)!").unwrap();
  |                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^

Значит ли это, что мне нужен ночной Rust для того, чтобы сделать эти переменные глобальными, или есть другой способ сделать это?

Ответ 1

Вы можете использовать макрос lazy_static следующим образом:

use lazy_static::lazy_static; // 1.3.0
use regex::Regex; // 1.1.5

lazy_static! {
    static ref RE: Regex = Regex::new(r"hello (\w+)!").unwrap();
}

fn main() {
    let text = "hello bob!\nhello sue!\nhello world!\n";
    for cap in RE.captures_iter(text) {
        println!("your name is: {}", &cap[1]);
    }
}

Если вы используете версию 2015 Rust, вы все равно можете использовать lazy_static через:

#[macro_use]
extern crate lazy_static;