Параметры могут быть переданы функции и изменения:Как изменить отрезок, который является параметром функции?
fn set_42(int: &mut i32) {
*int += 42;
}
fn main() {
let mut int = 0;
set_42(&mut int);
println!("{:?}", int);
}
42
Наивно изменить код, чтобы использовать ломтик терпит неудачу с целой кучей ошибок:
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
Если попытаться использовать изменяемый срез (который не то, что я действительно хочу; Я не хочу, чтобы изменить значение в срезе, я просто хочу, чтобы изменить сам срез так оно охватывает меньший диапазон элементов) и изменяемый параметр, он не имеет никакого влияния на оригинальном срезе:
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]
Вопрос: есть ли способ изменить кусочек это параметр функции? Я не хочу изменять элементы внутри среза; Я просто хочу изменить диапазон самого среза, чтобы он стал меньшим «суб-срезом».
Большое вам спасибо за подробное объяснение и аннотирование жизненных циклов. Это невероятно полезно! – Cornstalks