2016-02-03 5 views
11

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

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

extern crate regex; 
use regex::Regex; 

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.at(1).unwrap()); 
    } 
} 

Но я хотел бы, чтобы это было что-то вроде этого:

extern crate regex; 
use regex::Regex; 

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.at(1).unwrap()); 
    } 
} 

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

Compiling global v0.1.0 (file:///home/garrett/projects/rag/global) 
src/main.rs:4:20: 4:56 error: method calls in statics are limited to constant inherent methods [E0378] 
src/main.rs:4 static RE: Regex = Regex::new(r"hello (\w+)!").unwrap(); 
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
src/main.rs:4:20: 4:56 help: run `rustc --explain E0378` to see a detailed explanation 
src/main.rs:4:20: 4:47 error: function calls in statics are limited to struct and enum constructors [E0015] 
src/main.rs:4 static RE: Regex = Regex::new(r"hello (\w+)!").unwrap(); 
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~ 
src/main.rs:4:20: 4:47 help: run `rustc --explain E0015` to see a detailed explanation 
src/main.rs:4:20: 4:47 note: a limited form of compile-time function evaluation is available on a nightly compiler via `const fn` 
src/main.rs:4 static RE: Regex = Regex::new(r"hello (\w+)!").unwrap(); 

Означает ли это, что мне нужна ночная ржавчина, чтобы сделать эти переменные глобальными или существует er способ сделать это?

ответ

11

Вы можете использовать lazy_static макрос так:

extern crate regex; 

#[macro_use] 
extern crate lazy_static; 

use regex::Regex; 

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.at(1).unwrap()); 
    } 
} 
+0

большое спасибо! Это работало удивительно хорошо! – vitiral

+5

Кстати, можно опустить 'let re':' static ref RE: Regex = Regex :: new (...). Unwrap() 'должен работать. – huon

+0

@huon Хорошая точка. Это потому, что Regex реализует Deref правильно? – squiguy

Смежные вопросы