Почему обычно используются динамические ошибки в ржавчине, а не в перечислениях?это плохо / не возможно использовать варианты во время компиляции? - PullRequest
3 голосов
/ 26 сентября 2019

В Rust наблюдается такая тенденция, что ошибки в Result возвращаются так:

fn do_something() -> Result<SomeType, Box<dyn std::error::Error>> {
    // ...
}

Почему ошибки динамические?Исходя из опыта C ++ и предпочитая std::variant классическому полиморфизму (я относительно новичок в ржавчине), у меня аллергия на динамические выделения, поэтому я использую их только тогда, когда это действительно необходимо.Я также считаю, что перечисления Rust удивительны тем, что включили в них варианты.Может кто-нибудь объяснить, почему не является стандартным / предпочтительным / распространенным использование ошибок в качестве enum?

1 Ответ

4 голосов
/ 26 сентября 2019

В коде приложения это обычно делается для удобства.Создание статически известных всех типов ошибок может быть кошмаром обслуживания: у вас постоянно расширяется перечень возможных типов ошибок, большинство из которых вы никогда не будете пытаться обрабатывать индивидуально.У этих типов ошибок есть способ загрязнения сигнатур типов далеко от места, где ошибка фактически произошла бы.Box<dyn std::error::Error> обеспечивает чистоту, и дополнительное выделение обычно не является проблемой, потому что это происходит только в случае ошибки.

В библиотечных ящиках это происходит реже, но некоторый очень общий код не может знать, что всеВозможные типы ошибок могут быть.Это может быть очень неуклюже в работе с параметром типа для ошибок при составлении ряда типов результатов.Сложную структуру возможных статически известных комбинаций ошибок можно удобно свернуть в один тип, Box<dyn std::error::Error>.

...