2015-05-26 27 views
3

Моя проблема заключается в следующем, но я хотел бы задать несколько более широкий вопрос в названии.Как узнать текущую позицию итератора?

У меня есть итератор a типа Chars другой a строка. Предположим, что я нашел ошибку при чтении строки, и я хотел бы напечатать сообщение об ошибке. В этом сообщении должно указываться положение ошибки в строке (номер строки и т. Д.). Есть ли какой-либо метод в стандартной библиотеке Rust, который мог бы мне помочь?

ответ

5

Вы можете использовать Iterator::enumerate().

Вот пример с учетом Вашего случая использования:

fn one_indexed<T>((n, x): (usize, T)) -> (usize, T) { 
    (n+1, x) 
} 
fn main() { 
    let s = "abc def\nghi jkl"; 
    for (line_n, line) in s.lines().enumerate().map(one_indexed) { 
     for (char_n, char) in line.chars().enumerate().map(one_indexed) { 
      println!("character {} at {}:{}", char, line_n, char_n); 
     } 
    } 
} 

Печатается:

character a at 1:1 
character b at 1:2 
character c at 1:3 
character at 1:4 
character d at 1:5 
character e at 1:6 
character f at 1:7 
character g at 2:1 
character h at 2:2 
character i at 2:3 
character at 2:4 
character j at 2:5 
character k at 2:6 
character l at 2:7 
+0

это только часть решения, конечно же, как и тогда вам необходимо сопоставить позиции, которую вы получите от 'enumerate' до строки/столбца с точки зрения человека. Тем не менее, я считаю, что этот подход превосходит отслеживание строки/столбца тем, что «счастливый путь» не оплачивает расходы на обновление этих переменных. –

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