LINUX.ORG.RU

История изменений

Исправление 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% корректно, но ради эргономики решили этого не делать.

Наверное для такой «нерушимой» работы прийдется пользоваться специальными библиотеками где коллекции никогда не паникуют