LINUX.ORG.RU

не понимаю итераторы и оператор ?

 , ,


0

3

Решил написать на расте утилитку, в которой нужен проход по ФС.

Смотрю на doc.rust-lang.org, и вижу:

        for entry in fs::read_dir(dir)? {
            let entry = entry?;
            let path = entry.path();
            if path.is_dir() {
                visit_dirs(&path, cb)?;
            } else {
                cb(&entry);
            }
        }
    }

Нафига нужно let entry = entry?;? Ведь перебирающая переменная в for получается из значения итератора, зачем там еще какая-то проверка на ошибку, если директория прочитана успешно?

★★★★★

Потому что read_dir возвращает io::Result<ReadDir>, а для этого типа не реализован трейт Iterator.

io::Result<DirEntry> это уже результат реализации Iterator непосредственно для ReadDir.

Потому, что в результате просмотра директории может возникнуть ошибка. И поэтому надо возвращать не DirEntry, а Result<DirEntry>.

WatchCat ★★★★★
()
Последнее исправление: WatchCat (всего исправлений: 4)

В документации же написано:

The iterator will yield instances of io::Result<DirEntry>

Int64 ★★★
()
Последнее исправление: Int64 (всего исправлений: 2)
Ответ на: комментарий от anonymous

На го это бы было if dir, err := fs.readDir(dir); err != nil { return nil, err } :)

nikolnik ★★★
()

Ну штош. Это все сахар, потому что у раста нет нормальной системы ошибок. Поэтому этот нелепый ?. Еще момент. Если у тебя текущая функция возвращает что-то отличное от Result, который есть этот entry, тебе еще и костылей написать придется.

anonymous
()
Ответ на: комментарий от anonymous

Это такая монада Maybe для бедных императивщиков

Crocodoom ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.