Filipp
https://play.rust-lang.org/?gist=31fa9e9493bd77609d562a50ed755533&version=stable&mode=debug Посоны, почему он не понимает, что я io::Error имею в виду?
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
Evgεny
/split Impl trait
Filipp
идиотизмом было делать это как-то по-другому
идиотизм в том, что нельзя через вопросик пробросить ошибку, которая 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
идиотизм в том, что нельзя через вопросик пробросить ошибку, которая impl Trait
Кейс на самом деле не очень то подходящий для impl Trait
Cuno
Ты же явно знаешь, что там io::Error
Aleksey
если в методе возможно больше одного типа ошибки, то impl Trait вообще ведь не подойдет
Aleksey
а обычно ошибки разных типов
Filipp
убедительно
Aleksey
ну, тогда почему не явный io::Error, как пишут выше
Filipp
но вот в случае итераторов например impl Trait позволяет скрыть детали внутренней шаблонизации, что если у меня другой кейс и ошибка нашпигована всякими <caused_by=ApiError<caused_by=DbError>>
Filipp
только и останется, что руками пробрасывать
Filipp
или маппить как хаскелист последний
Денис
так
Денис
ответь на один вопрос
Денис
у тебя логика на ошибках?
Денис
если нет, то юзай бокс и не парься)
Aleksey
а если да? :)
Filipp
если нет, то юзай бокс и не парься)
звучит как "раст не смог в зирокост"
Денис
а если да, то переписывай всё
Денис
потому что это настолько антипаттерн, что все его юзающие должны непрерывно страдать
Денис
ятакщитаю
Денис
=)
Cuno
звучит как "раст не смог в зирокост"
io::Error уже не зирокост, так что можешь быть спокоен
Filipp
я про кейс в вакууме опять же говорю
պլհկ
F A I L U R E
Денис
F A I L U R E
но фейлюра тоже не зирокост...
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
https://doc.rust-lang.org/std/io/struct.Error.html#method.new
Там другие методы-конструкторы есть
Filipp
https://doc.rust-lang.org/std/io/struct.Error.html#method.new
https://doc.rust-lang.org/src/std/io/error.rs.html#311
պլհկ
os error зирокост, а тут сам виноват
պլհկ
я если честно хз в каких ситуациях этот new нужен
պլհկ
что за io::Error не от ос?
պլհկ
а откуда?
Денис
Там другие методы-конструкторы есть
from_raw_os_error-то?) я просто привёл именно new, потому что видел его в либах over 9000 раз
Денис
ну в смысле откуда
Денис
вот парсишь ты текст
Денис
и тут он закончился раньше времени
Денис
ну и кидаешь io::ErrorKind::UnexpectedEof
պլհկ
ну уж нет
Денис
я-то так, понятное дело, не делаю
Денис
но видел и не раз
պլհկ
я возьму ерор чейн дроченый
Cuno
Удваиваю Дениса. Тоже видел в либах.
պլհկ
и сделаю errors { UnexpectedEndOfText(..) }
Денис
время охуительных метрик