Hlavní navigace

Vlákno názorů k článku Datový typ Option v programovacím jazyku Rust od xxxxx - Nějak jsem nepochopil ten rozdíl od C-čkového "#define...

  • Článek je starý, nové názory již nelze přidávat.
  • 23. 2. 2017 6:52

    xxxxx (neregistrovaný) ---.142.broadband5.iol.cz

    Nějak jsem nepochopil ten rozdíl od C-čkového "#define MOJE_NAN MIN_INT a program plný podmínek testujících tuto speciální hodnotu" kontra "if let Some(val)= result"

    V C běžně užívám (své definované makro/inline funkci) něco ve stylu
    if NOTNAN(result=fun­kce(x,y)) { ...use result... } else { ...}

    Případně přímo NOTNAN(result=fun­kce(x,y)) && (...use result...)

    Jak se v Rust tedy omezí program plný podmínek. Lze nějak přímo použít Some(val), resp. unwrap, i když není definováno a výstupem je None? Nebo to v runtime také crashne, bez explicitní kontroly podmínkou na platnost? Má Rust nějakou implicitní ochranu navíc?

    P.S.: V C++ bývá výhodnější const a inline funkce. Je to prakticky totéž, ale pro jistotu to (mmch už v compile time) ohlídá typy a odhalí mojí případnou chybu.

  • 23. 2. 2017 8:03

    dizzy (neregistrovaný) ---.212-5-214.telecom.sk

    presne toto som sa tiez pytal sam seba ked som prechadzal z javy na scalu. Dobre je to hlavne ako nahrada za NULL hodnoty a to hned z dvoch dovodov:
    1 - hned z deklaracie vidis, ze funkcia nemusi vratit hodnotu a nuti ta to tento stav osetrit (co v pripade zlej dokumentacie alebo lenivosti programatorov byva dost castym zdrojom chyb)
    2 - prehladnost zapisu - ak mas napriklad zretazene 3 funkcie, z ktorych kazda je zavisla na vysledku tej predchadzajucej, v scale (a pravdepodobne aj v ruste) mozes spravit nieco taketo:

    funkcia1().flat­Map(res1 => funkcia2(resul­t1)).flatMap(res2 => funkcia3(resul­t3)).getOrElse(­...)

    co je imho omnoho elegantnejsie ako:

    typ1 res1 = funkcia1();
    if(typ1) {
    res2 = funkcia2(res2);
    if(res2)
    res3 = funkcia3(res3);
    if(res3)
    return res3;
    else ...
    else...
    else...

  • 23. 2. 2017 8:44

    xxxxx (neregistrovaný) ---.142.broadband5.iol.cz

    - O té jiné (upozorňující, varující) deklaraci jsem právě zkráceně mluvil v post scriptum. Do toho spadá i jiný typedef (a třeba i zákaz implicitní konverze). Případně až styl inline objekt /až template/ (s pouze inline funkcemi u kterých vím že se přeloží přímo). To je pak 100% ošetřené a v compile time (co jde). Což asi není nic jiného (ten extrémní případ) než totéž co dělá Rust. Jen to nechápu jako popis jazyka, ale prosté použití jazyka.

    - Zřetězení funkcí ale funguje jen pro stejný typ. To používám také, pro objekty, kdy návratová hodnota je reference na objekt (sebe) /příp. návrat přímo hodnotou když vím že po kompilaci to vyjde výhodněji/ a stav si udržuji uvnitř. Je tak možné reagovat i na různé typy chybových stavů a třeba se lépe vzpamatovat.

    Pro rozdílné typy je to && , tam už je jedno, jestli to "zřetězím" tečkou, ampersandem či jak. Styl, typová ochrana i výsledný překlad vyjdou nastejno.

  • 23. 2. 2017 10:11

    Pavel Tišnovský

    První důležitý rozdíl spočívá v tom, že uživatele té funkce "donutíš" se zabývat speciálním stavem, takže nedojde k tomu, že se například napíše char c=getc()) a jede se klidně dál.

    K tomu zjednodušení - když se použije zřetězení přes and_then, and, unwrap_or atd, tak je to částečné zjednodušení, ovšem užitečnější jsou například funkce map_or, map_or_else, umožňující skutečně zřetězení (s transformací hodnot na jiné typy). Zkusím ukázat.

  • 23. 2. 2017 10:28

    xxxxx (neregistrovaný) ---.142.broadband5.iol.cz

    Díky moc, právě jsem si psal odpověď na základě Vaší odpovědi na první otázku na fóru. :-D

    Teď už výhodě Option jasně rozumím. A považuji jej za _velmi_ přínosný. I kdyby už nebyly i žádně další výhody (zřetězení, ...). Chybu už v compile time, že jsem návratový chybový stav neohlídal, považuji za věc k nezaplacení.

    P.S.: Tisíceré díky za seriál.