LINUX.ORG.RU

История изменений

Исправление vlad9486, (текущая версия) :

Код-то может быть и не смешан, но парсер может запрашивать очередной блок входных данных, что повлечет ввод-вывод (естественно, с потенциальными ошибками ввода-вывда).

Но парсеру эти ошибки никто не передаст. Они будут обработаны там где происходит IO.

trait IO {
    fn read_more(&mut self, buffer: &mut [u8]) -> usize;
}

fn reader() -> impl IO { /* handle io errors here */ }

fn parse(io: &mut impl IO) -> Data { /* ... */ }

fn main() {
    let mut io = reader();
    let data = parse(&mut io);
    // ...
}

И никаких ?.

Исходная версия vlad9486, :

? пробрасывает ошибку снизу вверх, а не сверху вниз. Парсер будет ниже по стеку, в нем не будет ничего от ввода-вывода, он всегда будет вызываться на готовых данных и если произошла ошибка ввода вывода, он об этом не узнает.

Код-то может быть и не смешан, но парсер может запрашивать очередной блок входных данных, что повлечет ввод-вывод (естественно, с потенциальными ошибками ввода-вывда).

Но парсеру эти ошибки никто не передаст. Они будут обработаны там где происходит IO.

trait IO {
    fn read_more(&mut self, buffer: &mut [u8]) -> usize;
}

fn reader() -> impl IO { /* handle io errors here */ }

fn parse(io: &mut impl IO) -> Data { /* ... */ }

fn main() {
    let mut io = reader();
    let data = parse(&mut io);
    // ...
}

И никаких ?.