Hlavní navigace

Názor ke zprávičce NSA nabádá organizace, aby používaly jazyky, které bezpečně pracují s pamětí od MarSik - Neošetřují. V Golangu jde typicky o dvě návratové hodnoty,...

  • Aktualita je stará, nové názory již nelze přidávat.
  • 14. 11. 2022 10:46

    MarSik

    Neošetřují.

    V Golangu jde typicky o dvě návratové hodnoty, kde jedna je typu error (nebo ok:bool). Ten je ovšem velice abstraktní a neumí nic, kromě testu při přetypování. Hlavičky funkcí také nijak nespecifikují jaké errory se na výstupu mohou objevit.

    def funkce() (Typ, error) {
      if val, err := funkce(); err != nil {
        return nil, err
      }
    }

    V Rustu jde o jednu hodnotu v enumu Result a error typ v Resultu má konkrétní známý typ:

    Takto použito by to vypadalo skoro stejně:

    if let Err(err) = funkce() {
      return Err(err)
    }

    Jenže v Rustu lze díky tomu Result typu používat mnohem komplikovanější logiku. Result má funkce jako map a také se dá použít operátor otazník (tj. při erroru zavolej return error).

    fn funkce() -> Result<(), ErrTyp> {
      funkce2().map_err(|e| e.do_err_typu())?
      funkce3()?
      Ok(()) // Návratová hodnota v případě úspěchu
    }

    Výhoda jedné návratové hodnoty je právě v možnosti řetězení a zanoření.

    V principu je rozdíl mezi těmi přístupy malý, ale v praxi ta syntaxe je v Rustu kratší a jednoznačně definované typy chyb jsou přehlednější.

    Blízký ekvivalent toho otazníku z Rustu je tento návrh pro Golang, který nicméně zatím nebyl implementován: https://go.googlesource.com/proposal/+/master/design/go2draft-error-handling.md