Найти Π² Π”Π·Π΅Π½Π΅

πŸ¦€βœ¨ Новый взгляд Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ошибок Π² Rust: ΠΏΠΎΡ€Π° ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ гигантских enum?

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ программист, Ρ€Π°Π±ΠΎΡ‚Π°Π²ΡˆΠΈΠΉ с Rust, Π·Π½Π°Π΅Ρ‚ Π΅Π³ΠΎ Π²Π΅Π»ΠΈΠΊΠΎΠ»Π΅ΠΏΠ½ΡƒΡŽ систСму Ρ‚ΠΈΠΏΠΎΠ² ΠΈ возмоТности ΠΏΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ошибок Ρ‡Π΅Ρ€Π΅Π· Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… Result. Однако, нСсмотря Π½Π° всю красоту языка, Π² Rust укорСнился ΠΎΠ΄ΠΈΠ½ спорный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ β€” ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹Π΅ пСрСчислСния (enum), Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠ΅ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ошибки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Ρ†Π΅Π»ΠΎΠ³ΠΎ модуля ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΊΡ€Π΅ΠΉΡ‚Π°. Π’ свСТСй ΡΡ‚Π°Ρ‚ΡŒΠ΅ ЀСликса ΠšΠ½ΠΎΡ€Ρ€Π° прСдставлСн Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‰ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСбольшиС ΠΈ Π³ΠΈΠ±ΠΊΠΈΠ΅ структуры для описания ошибок. Π”Π°Π²Π°ΠΉΡ‚Π΅ разбСрёмся, Ρ‡Ρ‚ΠΎ Π² этом ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ интСрСсного ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ³ΠΎ. πŸ” Π§Ρ‚ΠΎ Π½Π΅ Ρ‚Π°ΠΊ с ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ гигантскими enum? Випичная ситуация Π² Rust-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… выглядит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ: enum HugeErrorEnum {
Io(std::io::Error),
ParseError(ParseError),
Network(NetworkError),
Custom(String),
} Π’Π°ΠΊΠΈΠ΅ большиС enum Π²Π΅Π΄ΡƒΡ‚ ΠΊ нСскольким ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ: 🚧 ΠŸΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅: ΠΌΠ΅Π»ΠΊΠΈΠ΅ структуры вмСсто Π±ΠΎΠ»ΡŒΡˆΠΈΡ… enum Автор ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ€Π°Π΄ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄: каТдая ошибка Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ максимально спСцифична ΠΈ нСзависима ΠΎΡ‚ Π΄Ρ€
Ferris-ΠΊΡ€Π°Π± ΠΆΠΎΠ½Π³Π»ΠΈΡ€ΡƒΠ΅Ρ‚ мноТСством Ρ€Π°Π·Π½ΠΎΡ†Π²Π΅Ρ‚Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² Β«ErrorΒ», показывая, ΠΊΠ°ΠΊ Π² Rust ΠΌΠΎΠΆΠ½ΠΎ Π³Ρ€Π°ΠΌΠΎΡ‚Π½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ошибок вмСсто Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ Π³Ρ€ΡƒΠ±ΠΎΠ³ΠΎ enum.
Ferris-ΠΊΡ€Π°Π± ΠΆΠΎΠ½Π³Π»ΠΈΡ€ΡƒΠ΅Ρ‚ мноТСством Ρ€Π°Π·Π½ΠΎΡ†Π²Π΅Ρ‚Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² Β«ErrorΒ», показывая, ΠΊΠ°ΠΊ Π² Rust ΠΌΠΎΠΆΠ½ΠΎ Π³Ρ€Π°ΠΌΠΎΡ‚Π½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ошибок вмСсто Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ Π³Ρ€ΡƒΠ±ΠΎΠ³ΠΎ enum.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ программист, Ρ€Π°Π±ΠΎΡ‚Π°Π²ΡˆΠΈΠΉ с Rust, Π·Π½Π°Π΅Ρ‚ Π΅Π³ΠΎ Π²Π΅Π»ΠΈΠΊΠΎΠ»Π΅ΠΏΠ½ΡƒΡŽ систСму Ρ‚ΠΈΠΏΠΎΠ² ΠΈ возмоТности ΠΏΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ошибок Ρ‡Π΅Ρ€Π΅Π· Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… Result. Однако, нСсмотря Π½Π° всю красоту языка, Π² Rust укорСнился ΠΎΠ΄ΠΈΠ½ спорный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ β€” ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹Π΅ пСрСчислСния (enum), Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠ΅ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ошибки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Ρ†Π΅Π»ΠΎΠ³ΠΎ модуля ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΊΡ€Π΅ΠΉΡ‚Π°. Π’ свСТСй ΡΡ‚Π°Ρ‚ΡŒΠ΅ ЀСликса ΠšΠ½ΠΎΡ€Ρ€Π° прСдставлСн Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‰ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСбольшиС ΠΈ Π³ΠΈΠ±ΠΊΠΈΠ΅ структуры для описания ошибок. Π”Π°Π²Π°ΠΉΡ‚Π΅ разбСрёмся, Ρ‡Ρ‚ΠΎ Π² этом ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ интСрСсного ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ³ΠΎ.

πŸ” Π§Ρ‚ΠΎ Π½Π΅ Ρ‚Π°ΠΊ с ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ гигантскими enum?

Випичная ситуация Π² Rust-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… выглядит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

enum HugeErrorEnum {
Io(std::io::Error),
ParseError(ParseError),
Network(NetworkError),
Custom(String),
}

Π’Π°ΠΊΠΈΠ΅ большиС enum Π²Π΅Π΄ΡƒΡ‚ ΠΊ нСскольким ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ:

  • ❌ ΠΠ΅Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ: часто Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Π°, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ошибки конкрСтная функция ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ.
  • πŸ› Ошибки ΠΏΡ€ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅: ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° ошибки приходится ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ΅ количСство ΠΊΠΎΠ΄Π°.
  • πŸ“– ΠΠ΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ постоянного обращСния ΠΊ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ошибки Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ контСкста.

🚧 ΠŸΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅: ΠΌΠ΅Π»ΠΊΠΈΠ΅ структуры вмСсто Π±ΠΎΠ»ΡŒΡˆΠΈΡ… enum

Автор ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ€Π°Π΄ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄: каТдая ошибка Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ максимально спСцифична ΠΈ нСзависима ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ…. ВмСсто ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ³ΠΎ enum ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Π»ΠΊΠΈΠ΅ структуры (struct), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ Π² нСбольшиС ΠΈ понятныС Π½Π°Π±ΠΎΡ€Ρ‹ ошибок.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ простого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΈΠ· популярного ΠΊΡ€Π΅ΠΉΡ‚Π° terrors:

fn perform_action() -> Result<(), OneOf![NotFound, InvalidInput]> {
//...
}

Однако Ρƒ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π΅ΡΡ‚ΡŒ ΠΈ минусы:

  • βš™οΈ ΠΠ΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ постоянного использования .map_err(OneOf::broaden) для ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΠΈ.
  • πŸ“Œ Блишком большая ΠΌΠ½ΠΎΠ³ΠΎΡΠ»ΠΎΠ²Π½ΠΎΡΡ‚ΡŒ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ с мноТСством ошибок.

πŸ”₯ ΠšΠΎΠΌΠΏΡ€ΠΎΠΌΠΈΡΡΠ½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ β€” crate error_set

ЀСликс ΠšΠ½ΠΎΡ€Ρ€ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΈ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π² ΠΊΡ€Π΅ΠΉΡ‚Π΅ error_set. Он позволяСт ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹Π΅ Π½Π°Π±ΠΎΡ€Ρ‹ ошибок с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ макросов, автоматичСски гСнСрируя Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Ρ€Π΅ΠΉΡ‚ΠΎΠ².

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ выглядит использованиС error_set Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Π°Π²Ρ‚ΠΎΡ€Π°:

error_set! {
BtlePlug = {
BtlePlug(btleplug::Error)
};

FindDeviceError = { NoAdapter, Timeout, DeviceNotFound } || BtlePlug;
ConnectionError = { NoRxChar, NoTxChar } || BtlePlug;
OperationError = FindDeviceError || ConnectionError || SendError(mpsc::SendError<Vec<u8>>);
}

Π§Ρ‚ΠΎ здСсь интСрСсного?

  • πŸš€ АвтоматичСская конвСртация ошибок с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ?. ΠšΡ€Π°Ρ‚ΠΊΠΎ, ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈ Π½Π°Π΄Ρ‘ΠΆΠ½ΠΎ.
  • 🧩 Π“ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ Π² объСдинСнии Π½Π°Π±ΠΎΡ€ΠΎΠ². ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ ошибок ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² сСбя Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π½Π°Π±ΠΎΡ€Ρ‹, Ρ‡Ρ‚ΠΎ сниТаСт Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°.
  • πŸ“¦ Π§ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΈ Π»Ρ‘Π³ΠΊΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ. Π“ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ошибки ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ конкрСтная функция.

Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³: Ссли добавляСтся новая ошибка, Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ вСсь ΠΊΠΎΠ΄ β€” достаточно просто Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π½Π°Π±ΠΎΡ€ ошибок.

πŸ€” Π”Ρ€ΡƒΠ³ΠΈΠ΅ интСрСсныС ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹

Автор Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ нСсколько Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ², Π·Π°ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… внимания:

  • πŸ“Œ SmartErr – Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ crate, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‰ΠΈΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠ½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок с минималистичным ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ.
  • πŸ§™ ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² – гипотСтичСский ΠΊΡ€Π΅ΠΉΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π°Π²Ρ‚ΠΎΡ€ ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹ Π²ΠΈΠ΄Π΅Π», позволял автоматичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ enum ошибок, анализируя Ρ‚Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (ΡƒΠ²Ρ‹, ссылка Π±Ρ‹Π»Π° утСряна, Π½ΠΎ идСя ΠΈΠ½Ρ‚Ρ€ΠΈΠ³ΡƒΡŽΡ‰Π°Ρ!).

πŸ’¬ Π›ΠΈΡ‡Π½ΠΎΠ΅ ΠΌΠ½Π΅Π½ΠΈΠ΅ Π°Π²Ρ‚ΠΎΡ€Π° ΡΡ‚Π°Ρ‚ΡŒΠΈ

На ΠΌΠΎΠΉ взгляд, ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ с ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΌΠΈ enum стал ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡ΠΊΠΎΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ стоит ΠΏΠ΅Ρ€Π΅ΠΎΡΠΌΡ‹ΡΠ»ΠΈΡ‚ΡŒ. Π‘Π°ΠΌ я Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ сталкивался с ситуациями, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Π΄ΠΎΠ»Π³ΠΎ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ошибки Ρ€Π΅Π»Π΅Π²Π°Π½Ρ‚Π½Ρ‹ Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ контСкстС. МСлкиС ΠΈ Ρ‡Ρ‘Ρ‚ΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ структуры с Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ Ρ‡Π΅Ρ€Π΅Π· макросы выглядят Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π»ΠΎΠ³ΠΈΡ‡Π½Π΅Π΅ ΠΈ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅.

ОсобСнно ΠΏΠΎΠ»Π΅Π·Π΅Π½ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ, API ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… постоянно Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ. Π“ΠΈΠ±ΠΊΠΈΠ΅ структуры ошибок ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ измСнСния Π±Π΅Π· Π±ΠΎΠ»ΠΈ, сохраняя ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΈ удобство использования.

πŸ“ Π’Ρ‹Π²ΠΎΠ΄Ρ‹ ΠΈ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ

ИспользованиС ΠΌΠ΅Π»ΠΊΠΈΡ… структур ΠΈ crate Π²Ρ€ΠΎΠ΄Π΅ error_set каТСтся ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ для ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° Rust. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ стоит Π²Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ постСпСнно, провСряя Π΅Π³ΠΎ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ случаС. Π“Π»Π°Π²Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ: Ρ‡Π΅ΠΌ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π΅Π΅ ΠΈ мСньшС Ρ‚ΠΈΠΏ ошибки, Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΡ‰Π΅ с Π½Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ.

Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², Rust извСстСн своСй строгой систСмой Ρ‚ΠΈΠΏΠΎΠ² ΠΈ удобством Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ошибками β€” Ρ‚Π°ΠΊ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти прСимущСства ΠΏΠΎ максимуму?

πŸ”— ΠŸΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ссылки: