Vladimir
А как это в системе типов?
Vladimir
я уже посмотрел
Vladimir
ну вот к "кастомным типам" еще в каждом энаме несет дополнительный вариант "строка", поправьте если я не прав
Маjко
Да
Vladimir
И короче выходит, что каждый уровень эрор чейн требует определения такого энама
enum Foo {
Error1(std::Error),
Error2(io::Error),
Error3(my_lib::Error),
Msg(String)
}
enum Bar {
Error1(std::Error),
Error2(io::Error),
Error3(other_lib::Error),
FooError(Foo),
Msg(String)
}
Vladimir
Как альтернатива можно юзать трейт Box<std::Error>
он в отличии от энама уже расширяемый, и нет необходимости создавать миллион таких энамов для каждой либы.
Alexander
а растеры с проблемами ErrorT столкнулись..
Alexander
а неч другое, ну ладно
պլհկ
В чем проблема енума на либу?
պլհկ
Как бокс матчить?
Vladimir
Вот и выходит, у подхода error-chain:
1) на каждом уровне монструозные энамы
2) необходимо везде создавать эти энамы вручную
3) зато есть бектрейс
у подхода Box<std::Error>:
1) необходимо в методах везде писать Box<Error>, не так критично, но когда методов много - не приятно
2) типажи из стд обычно содержут минимально необходимый функционал, для ошибок это Debug. Но этого функционала в большинстве случаев не хватает, например казалось бы логичным, раз ошибки это всеголишь некий тип с сообщением, что оно должно реализовывать Display - выводиться для пользователя, а также иметь возможность передаваться между потоками Send + Sync - но выпо скольку этого нет в стандартной библиотеке желание работать в многопоточном коде с ошибками приводит к чему-то типа Tait:Error+Sync+Send по сути Failure это "стандартный" способ задать это.
3) в стандартной библиотеке ошибки не содержат бектрейс.
Vladimir
есть Any для этого
Filipp
Ну макросом же а не вручную
Vladimir
Макрос лишь выводит impl, варианты ты пишешь вручную
Vladimir
к тому же не знаю как там, но кажется дисплей тоже вручную надо реализовывать?
պլհկ
InvalidToolchainName(t: String) {
description("invalid toolchain name")
display("invalid toolchain name: '{}'", t)
}
Vladimir
ну тогда в целом так же как в Failure
Vladimir
основным бы кейсом я б рассмотрел в споре с error-chain различие при диспатченге enum vs Box<Trait>.
պլհկ
У меня иррациональный страх боксов
Anton
аргумент
Vladimir
х)
Anton
по идее енум безопаснее пересылать между тредами чем указатель
Vladimir
пиздос
Vladimir
ладно, сделаю вид, что я этого не читал
Vladimir
но насчет боксов да, у меня тоже есть такой страх, а всё изза того, что везде вдалбливают, что "аллокации очень медленны". В реальных же задачах кроме узких место его влияние почти не заметно
Anton
пиздос
ну да, раст же безопастный, забываю
Anton
ну вон токио активно юзает боксы
Vladimir
зависит от того, что ты подразумеваешь под "безопаснее" в передаче енамов/боксов
Anton
если не рассматривать unsafe один хрен
Vladimir
безопасность раста как-то слабо сочетается с передачей указателей. Точно также может быть не безопасно передавать енамы, никто не гарантирует что энамы - владеют данными
Anton
ну речь об ошибках, в енумах ошибок строки редкость
Vladimir
Ха-ха
Vladimir
Кстати ещё один аргумент к failure это возможность работать с Статик строками без перевода из в стринги (поидее, я не в курсе есть ли она) так что для строк это даже немного быстрее будет чем для кейса с эрорчейном
Anton
ну тут еще момент
Anton
error chain на базе std error
Anton
failure не привязан
Vladimir
И?
Vladimir
Он идёт в замену, в дополнение к СТД эрору
Anton
ну если есть какойнить embed
Anton
no_std
Vladimir
Эрор разве не в коре?
Anton
вроде нет
Vladimir
странно, почему?
Anton
https://doc.rust-lang.org/core/
Anton
хз
Anton
по той же причине по кторой выкинули grenthreads
Vladimir
да гринтреды рантайм требуют
Vladimir
а ерор нет
Anton
ну по идее и option нет
Anton
и result
Vladimir
есть
Anton
в чем?
Vladimir
https://doc.rust-lang.org/nightly/core/option/
Anton
Для тех кто не ковырялся
Anton
О
Anton
уже в найтли
Vladimir
да они наверн и в стейбле есть
պլհկ
Vladimir
https://doc.rust-lang.org/core/option/
պլհկ
Str(s: &'static str) {
display("what {}", s)
description("bla")
}
Anton
Anton
а, вижу
Vladimir
было б странно и их убрать
պլհկ
видимо потому что ты обычно не хочешь так
Vladimir
Vladimir
а потом её заменить вариантом энама
Маjко
Нет ничего более постоянного, чем временное
Vladimir
ну тогда идея не сделали бы кнопку "рефакторинг"
Loo
@mersinvald @white_oak
Судзумия
Loo
Судзумия
Vladimir
Так
Ебать ты как бетмен, на зов приходишь
Судзумия
Vladimir
Loo