Vlákno názorů k článku Rust: předávání parametrů referencí, elegantní způsob práce se sekvencemi od asdf - To předávání parametrů je trochu nešťastně napsáno a...

  • Článek je starý, nové názory již nelze přidávat.
  • 23. 11. 2016 15:53

    asdf (neregistrovaný)

    To předávání parametrů je trochu nešťastně napsáno a moc nevysvětluje, co se vlastně děje. Rust si vynucuje svůj Ownership/Borrowing model. Takže při

    fn funkce(arg1: typ) {...}

    si prostředí funkce bere vlastníctví arg1 a v prostředí které volalo funkci k arg1 už nelze přistupovat - zásadní rozdíl od předání hodnotou v C. Co ovšem může být matoucí a opravdu by to mělo být zdůrazněno, jsou traity (obdoba třeba interfaců v Javě) Clone a Copy. Clone říká, že se z typu dá udělat hluboká kopie a poskytuje k tomu funkci .clone(), Copy můžou implementovat jen typy implementující zárověň Clone a říká, že kopie se udělá přesným zkopírováním hodnoty a zárověň se pří předání preferuje kopie nad předání vlastnictví (důležité! protože proto se může zdát že primitivní typy nějak nezapadají do Ownership/Borrowing modelu, ve skutečnosti jen implementují Copy).

    Rust kontroluje správnost implementací tím, že struct může implementovat Clone pokud všechny jeho složky jsou taky Clone a stejně u tak Copy. Takovéhle stupňující implementace jsou použity i u Send a Sync - traity pro multithreading říkající že typ se dá zdílet mezi vlákny a že se dá zdílet reference.

    Pro usnadnění implementace se dají Clone a Copy implementovat automaticky pomocí #[derive(Clone, Copy)]

    Dále reference & a &mut implementují trait Deref který při přístupu k ní automaticky dereferencuje. Dá se to použít na různé wrappery, třeba vektor Vec můžeme díky tomu indexovat, ale k tomu navíc drží kapacitu a zaplnění.

  • 23. 11. 2016 17:42

    BoneFlute

    Už takhle si lidé traity a interface pletou. Rust (ve kterém je trait skutečně interface jak jej známe z Javy například) v tom udělá dalíš bordel :-D

  • 23. 11. 2016 17:55

    Pavel Tišnovský
    Zlatý podporovatel

    Díky moc za doplnění. No popravdě jsem nechtěl o owneshipu-borrowingu mluvit už v této části, už tak to asi lidi dostatečně mate i bez něho :-) Jinak asi tedy jen doplním, že vlastnictví se neřeší jen pro funkce, ale například i pro "jednoduché" přiřazení (akorát to znovu pro primitivní typy není patrné, protože implementují Copy trait, ale už pro struct nebo Vec to vyhodí chybu, u vektorů kvůli kontrole, kolik existuje ukazatelů na objekt na heapu).