Create an array
let arr: [i32; 5] = [1, 2, 3, 4, 5];
Create a string
Only to read -> let s: &str;
To modify -> let s: String;
(String has string modification methods such as character insertion, string insertion, removal, clearing, contains, from str to String,…)
Multi dimensional array
let array: [[i64; 6] ;2];
Pass reference read-only
fn(&var)
Pass reference to modify, without losing ownership
fn(&mut var)
Passing and returning arrays
let mut arr: [i32, 5];
fn(arr)
fn function (mut arr: [i32 ; 5]) -> [i32 ; 5]{
return arr;
}
How to create new asyncronous channel?
let (tx, rx) = mpsc::channel()
Cosa fa clone?
Per Collezioni clone copia effettivamente il dato.
Per smart pointers copia solo indirizzo allo stesso blocco di memoria.
vettore indicizzato da cui rimuovere o aggiungere in testa
VedDeque<T>
pop back, pop front, push front, push back</T>
mappa normale?
HashMap<K,V>.
get(), get_mut()
trait: Eq + std::hash::Hash
iterare lista
.iter o .iter_mut
condivisione di ownership?
Rc<t> signle thread, Arc<t> multithread</t></t>
mutabilità interna?
RefCell<T> single thread (.borrow(), .borrow_mut()).</T>
Mutex<T> multithread (.lock())
oppure RxLock<T> se più accessi il lettura che scrittura (.read(), .write())</T></T>
Singola ownership?
Box<T> single thread</T>
per struct ricorsive o trait dinamici. Perché permette ad entrambi di non conoscere in compilazione la grandezza precisa di struct o trait, perché tanto in compilazione viene controllato lo stack e nello stack la box ha solo un puntatore di dimensione fissa.
A differenza di ownership normale che fa vivere i dati sullo stack, box li sposta sull’heap quindi è adatto per dati piu grandi.
Accedere a valore di Arc?
&*var
accedere a Result?
var.unwrap()
Accedere a valore di MutexGuard?
*var
Come gestire mutex?
prima di accederci fare sempre lock, poi fare drop esplicito nel caso di notify all.
Attenzione ad aggiornare la guard in caso di wait
Impostando un problema a cosa stare attenti?
valore di ritorno delle funzioni
Vedo vari riferimenti mutabili ed immutabili, a cosa devo stare attento?
che non possono esserci più riferimenti mutabili attivi insieme ad altri riferimenti immutabili attivi. in particolare scrittura->poi scrittura
Quando serve la lifetime?
Quando una funzione prende più riferimenti e ne restituisce meno, dato che il compilatore non sa a quale dato il result farebbe riferimento.
oppure in una struct con riferimenti interni. (es &str)
Dopo che uso lifetime…?
attenzione che i parametri lifetime devono vivere >= del result
Prima cosa a cui stare attenti quando viene trasferita ownership?
Se il tipo è primitivo, quindi copy. non trasferisce MAI ownership nel caso
Closure differenza move o non move?
move trasferisce ownership sempre.
senza move trasferisce ownership solo se NECESSARIO. NECESSARIO SE: valore ritornato, dichiarazione, metodi consumatori come drop, into_…, iteratori che modificano, Option/Result.