История изменений
Исправление
vertexua,
(текущая версия)
:
Никакого контракта в сигнатуре нет. Вон сигнатура foo<T, E, F>(create: F) -> Result<(), E> where F: FnOnce() -> Result<T, E>. Где в ней выбрасываемое Vec::push исключение, которое в Расте упорно называют «panic»? Его нет. Ни в сигнатуре Vec::push, ни в сигнатуре foo. Вы можете написать catch (aka «panic_handler») для него. О каком контракте идет речь?
Ну вот даже Haskell падает с Out of memory совершенно в чистых сигнатурах. Если учитывать такое, то получается абсолютно каждая функция где происходит аллокация должна возвращать Result. Да, это было бы 100% корректно, но ради эргономики решили этого не делать.
Наверное для такой «нерушимой» работы прийдется пользоваться специальными библиотеками где коллекции никогда не паникуют. Для языка нету ничего невозможного, но в стандартной библиотеке решили так не делать
Исходная версия
vertexua,
:
Никакого контракта в сигнатуре нет. Вон сигнатура foo<T, E, F>(create: F) -> Result<(), E> where F: FnOnce() -> Result<T, E>. Где в ней выбрасываемое Vec::push исключение, которое в Расте упорно называют «panic»? Его нет. Ни в сигнатуре Vec::push, ни в сигнатуре foo. Вы можете написать catch (aka «panic_handler») для него. О каком контракте идет речь?
Ну вот даже Haskell падает с Out of memory совершенно в чистых сигнатурах. Если учитывать такое, то получается абсолютно каждая функция где происходит аллокация должна возвращать Result. Да, это было бы 100% корректно, но ради эргономики решили этого не делать.
Наверное для такой «нерушимой» работы прийдется пользоваться специальными библиотеками где коллекции никогда не паникуют