2016-03-28 2 views
0

У меня есть строковый ввод, который нужно разделить на значения и сопоставленные шаблоны, поэтому я ищу лучший способ сделать это.Строка сопоставления строк и извлечения значений

Это то, что у меня есть до сих пор.

fn main() { 

    let s: &str = "A 1 2 3 4"; 

    let v: Vec<&str> = s.split(" ").collect(); 

    match &v[..] { 
     [letter, x1, x2, x3] => println!("{:?}", letter), //do something with values 
     [letter, x1, x2, x3, x4] => println!("{:?}", letter), //do something with values 
     _ => println!("no match") 
    } 

} 

У меня есть несколько проблем с этим подходом:

  1. Этот код выдает ошибку error: slice pattern syntax is experimental (see issue #23121) поэтому я предполагаю, что я должен использовать каждую ночь, чтобы он работал? Нужно ли мне импортировать дополнительный модуль для этого?
  2. Есть ли такой же простой подход, который не требовал бы ночной?
  3. Есть ли элегантный способ дальнейшего согласования, чтобы вытащить целочисленные значения? Например, можно ли преобразовать вектор в кортеж так, чтобы ("A", 1, 2, 3, 4) соответствовал бы и ("A", 1, 2, "D") не был бы?

ответ

2
  1. Этот код выдает ошибку error: slice pattern syntax is experimental (see issue #23121) поэтому я предполагаю, что я должен использовать каждую ночь, чтобы он работал? Нужно ли мне импортировать дополнительный модуль для этого?

Да, на данный момент вы должны использовать ночной компилятор. Вы также должны добавить #![feature(slice_patterns)] в свой корневой каталог.

  1. Есть ли простой подход, который не требовал бы ночной?

В вашем примере ветка зависит от длины результирующего вектора. Так что, конечно, вы можете просто match v.len(). Как только вы узнаете длину вектора, вы можете получить к нему доступ с помощью []. Для того, чтобы связать те с хорошими именами, вы можете сделать это следующим образом:

match v.len() { 
    4 => { 
     let (letter, x1, x2, x3) = (v[0], v[1], v[2], v[3]); 
     // ... 
    } 
    // ... 
} 

Это, конечно, не так хорошо, как шаблон среза, но, по крайней мере, он работает на стабильной.

  1. Есть ли элегантный способ дальнейшего согласования, чтобы вытащить целочисленные значения? Например, можно ли преобразовать вектор в кортеж, чтобы («A», 1, 2, 3, 4) соответствовали бы и («A», 1, 2, «D») не было бы?

Вы не можете действительно преобразовывать типы в соответствие шаблону. Преобразование фрагментов в кортежи тоже не работает - обе вещи довольно разные. Срезы однородны и их длина неизвестна во время компиляции; кортежи могут содержать переменные разных типов, и их длина должна быть известна во время компиляции.

+2

Я не думаю, что это полный ответ, но это то, для чего был создан ящик ['scan-rules'] (https://crates.io/crates/scan-rules). –

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