是否可以创建一个引用惰性静态值的向量?

Jus*_*ank 3 static vector rust

以下代码编译:

let x = Regex::new(r"\d+").unwrap();
let y = Regex::new(r"asdf\d+").unwrap();
let regexes = vec![x, y];
Run Code Online (Sandbox Code Playgroud)

但是这段代码没有:

lazy_static! {
    static ref X_PRIME: Regex = Regex::new(r"\d+").unwrap();
    static ref Y_PRIME: Regex = Regex::new(r"asdf\d+").unwrap();
}
let regexes = vec![X_PRIME, Y_PRIME];
Run Code Online (Sandbox Code Playgroud)

错误是:

error[E0308]: mismatched types
  --> src\syntax\lex.rs:19:33
   |
19 |     let regexes = vec![X_PRIME, Y_PRIME];
   |                                 ^^^^^^^ expected struct `syntax::lex::lex::X_PRIME`, found struct `syntax::lex::lex::Y_PRIME`
   |
   = note: expected type `syntax::lex::lex::X_PRIME`
   = note:    found type `syntax::lex::lex::Y_PRIME`
Run Code Online (Sandbox Code Playgroud)

ken*_*ytm 7

是.lazy_static给出X_PRIMEY_PRIME不同的类型,但它们都实现Deref<Regex>,所以你可以写:

let regexes = vec![&*X_PRIME, &*Y_PRIME];
// The * dereferences the values to a `Regex` type
// The & turn them back into references `&Regex`.
Run Code Online (Sandbox Code Playgroud)

您还可以定义另一个静态:

lazy_static! {
    static ref X_PRIME: Regex = Regex::new(r"\d+").unwrap();
    static ref Y_PRIME: Regex = Regex::new(r"asdf\d+").unwrap();
    static ref REGEXES: Vec<&'static Regex> = vec![&X_PRIME, &Y_PRIME];
}
Run Code Online (Sandbox Code Playgroud)