I parametri possono essere passati alle funzioni e modificati:Come posso modificare una porzione che è un parametro di funzione?
fn set_42(int: &mut i32) {
*int += 42;
}
fn main() {
let mut int = 0;
set_42(&mut int);
println!("{:?}", int);
}
42
Ingenuamente cambiare il codice per utilizzare una fetta non riesce con un sacco di errori:
fn pop_front(slice: &mut [i32]) {
*slice = &{slice}[1..];
}
fn main() {
let mut slice = &[0, 1, 2, 3][..];
pop_front(&mut slice);
println!("{:?}", slice);
}
<anon>:2:14: 2:27 error: mismatched types:
expected `[i32]`,
found `&[i32]`
(expected slice,
found &-ptr) [E0308]
<anon>:2 *slice = &{slice}[1..];
^~~~~~~~~~~~~
<anon>:2:14: 2:27 help: see the detailed explanation for E0308
<anon>:2:5: 2:11 error: the trait `core::marker::Sized` is not implemented for the type `[i32]` [E0277]
<anon>:2 *slice = &{slice}[1..];
^~~~~~
<anon>:2:5: 2:11 help: see the detailed explanation for E0277
<anon>:2:5: 2:11 note: `[i32]` does not have a constant size known at compile-time
<anon>:2:5: 2:11 note: the left-hand-side of an assignment must have a statically known size
error: aborting due to 2 previous errors
Se proviamo con una fetta mutabile (che non è quello che voglio veramente; Non voglio modificare i valori all'interno della fetta, voglio solo di modificare la fetta in sé in modo da coprire una gamma più ridotta di elementi) e un parametro mutevole, non ha alcun effetto sulla fetta originale:
fn pop_front(mut slice: &mut [i32]) {
slice = &mut {slice}[1..];
}
fn main() {
let mut slice = &mut [0, 1, 2, 3][..];
pop_front(&mut slice);
println!("{:?}", slice);
}
[0, 1, 2, 3]
domanda: c'è un modo per modificare una fetta che è un parametro di funzione? Non voglio modificare gli elementi all'interno della sezione; Voglio solo modificare l'intervallo della fetta stessa in modo che diventi una "sottoscheda" più piccola.
Grazie mille per la spiegazione dettagliata e l'annotazione delle vite. È incredibilmente utile! – Cornstalks