2016-12-27 9 views
3

Следующий код компилирует:Можно ли создать вектор со ссылками на лениво-статические значения?

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

Но этот код не будет:

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]; 

Ошибка:

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` 

ответ

7

Да. lazy_static дает X_PRIME и Y_PRIME различных типов, но они оба implement Deref<Regex>, так что вы могли бы написать:

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

Вы также можете просто определить другой статический:

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]; 
} 

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

  • Нет связанных вопросов^_^