Parametry mogą być przekazywane do funkcji i modyfikacji:Jak zmodyfikować plaster, który jest parametrem funkcji?
fn set_42(int: &mut i32) {
*int += 42;
}
fn main() {
let mut int = 0;
set_42(&mut int);
println!("{:?}", int);
}
42
Naiwnie zmiany kodu użyć kawałek nie z całą masę błędów:
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
Jeśli spróbujemy stosując zmienny slice (co nie jest to, co naprawdę chcę; Nie chcę, aby zmodyfikować wartości w kawałkach, po prostu chcę, aby zmodyfikować sam kawałek więc obejmuje mniejszy zakres elementów) oraz zmienny parametr, to nie ma wpływu na oryginalny kawałek:
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]
Pytanie: Czy istnieje sposób zmodyfikować kawałek, który jest parametrem funkcji? Nie chcę modyfikować elementów wewnątrz plasterka; Chcę tylko zmodyfikować zakres samego plasterka, aby stał się mniejszym "pod-plasterkiem".
Dziękuję bardzo za szczegółowe wyjaśnienie i adnotację o życiu. Jest niesamowicie pomocny! – Cornstalks