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í.
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).