Как проверить EOF с помощью `read_line()`?

Учитывая приведенный ниже код, как я могу специально проверить EOF? Или, скорее, как я могу различить "здесь ничего нет" и "оно взорвалось"?

match io::stdin().read_line() {
    Ok(l) => print!("{}", l),
    Err(_) => do_something_else(),
}

1 ответ

Решение

После ржавчины 1,0

read_line теперь требуется буфер для добавления, поэтому возвращаемое значение стало более выразительным. Из документации дляread_line:

Если этот читатель в настоящее время на EOF, то эта функция не будет изменять buf и вернется Ok(n) где n количество байтов, которые были прочитаны.

До Ржавчины 1.0

Я проверил стандартную версию библиотеки BufferPrelude::lines, Вы хотите использовать сопоставление с шаблоном, который определяет kind ошибки:

match self.buffer.read_line() {
    Ok(x) => Some(Ok(x)),
    Err(IoError { kind: EndOfFile, ..}) => None,
    Err(y) => Some(Err(y))
}

В сторону, вы могли бы использовать .lines() непосредственно:

for line in io::stdin().lock().lines() {
    match line {
        Ok(x) => ...,
        Err(x) => ...,
    }
}
Другие вопросы по тегам