Filipp
https://play.rust-lang.org/?gist=31fa9e9493bd77609d562a50ed755533&version=stable&mode=debug
Посоны, почему он не понимает, что я io::Error имею в виду?
Cuno
Filipp
щто?
Cuno
? "разворачивается" не просто в if is_error { return error } а в if is_error { return error.into() }
Cuno
и тут уже непонятно во что конвертить
Filipp
идиотизм
Filipp
спасибо, стало понятно
Денис
в смысле идиотизм?
Денис
идиотизмом было делать это как-то по-другому
Денис
@samoylovfp не благодари https://play.rust-lang.org/?gist=6858b589b114a024610781a76b6d9955&version=stable&mode=debug
Filipp
Evgεny
/split Impl trait
Filipp
само по себе то очень хорошо, что ошибки конвертятся, но вот этот кейс идиотичный
Денис
нам нужен новый ключевой символ
Денис
который бы пробрасывал ошибку, не конвертируя =)
Денис
потому что теперь это реально может пригодиться
Filipp
это выглядит как еще больший идиотизм
Денис
fn test(somepath: &Path) -> Result<PathBuf, impl Error> {
let result = PathBuf::from("/tmp").join(match somepath.canonicalize() {
Ok(x) => x,
Err(e) => return Err(e),
});
Ok(result)
}
Денис
=)))
Filipp
азаза
Cuno
Cuno
Ты же явно знаешь, что там io::Error
Aleksey
если в методе возможно больше одного типа ошибки, то impl Trait вообще ведь не подойдет
Aleksey
а обычно ошибки разных типов
Filipp
Filipp
убедительно
Aleksey
ну, тогда почему не явный io::Error, как пишут выше
Filipp
но вот в случае итераторов например impl Trait позволяет скрыть детали внутренней шаблонизации, что если у меня другой кейс и ошибка нашпигована всякими <caused_by=ApiError<caused_by=DbError>>
Filipp
только и останется, что руками пробрасывать
Filipp
или маппить как хаскелист последний
Денис
так
Денис
ответь на один вопрос
Денис
у тебя логика на ошибках?
Денис
если нет, то юзай бокс и не парься)
Aleksey
а если да? :)
Денис
а если да, то переписывай всё
Денис
потому что это настолько антипаттерн, что все его юзающие должны непрерывно страдать
Денис
ятакщитаю
Денис
=)
Filipp
я про кейс в вакууме опять же говорю
պլհկ
F A I L U R E
Cuno
Денис
պլհկ
Денис
хотя не то чтобы это прям норм
Filipp
Filipp
а с импл трейтом нет аллокейшна
Денис
аллокейшн
* ну и норм, один аллокейшен не должен просадить ничего
Filipp
звучит как "раст не смог в зирокост"
Cuno
почему?
Оно в ряде случаев аллоцирует
պլհկ
pub struct Error {
repr: Repr,
}
enum Repr {
Os(i32),
Simple(ErrorKind),
Custom(Box<Custom>),
}
պլհկ
только в кастоме
Денис
"только"
Filipp
вобщем понятно что кейз редкий, но все равно грустно, что не работает, хотя со стороны выглядит, что должно работать
Денис
https://doc.rust-lang.org/std/io/struct.Error.html#method.new
Filipp
и я не вижу как быстро и надежно зачинить :(
Cuno
Filipp
պլհկ
os error зирокост, а тут сам виноват
պլհկ
я если честно хз в каких ситуациях этот new нужен
պլհկ
что за io::Error не от ос?
պլհկ
а откуда?
Денис
ну в смысле откуда
Денис
вот парсишь ты текст
Денис
и тут он закончился раньше времени
Денис
ну и кидаешь io::ErrorKind::UnexpectedEof
պլհկ
ну уж нет
Денис
я-то так, понятное дело, не делаю
Денис
но видел и не раз
պլհկ
я возьму ерор чейн дроченый
Cuno
Удваиваю Дениса. Тоже видел в либах.
պլհկ
и сделаю errors { UnexpectedEndOfText(..) }
Денис
время охуительных метрик
Marat