可变切片

当我们谈及切片类型,比如字符串切片(&str)和泛型切片([T])时,我们通常指的是它们的不可变借用形式(&str 和 &[T])。但实际上,切片也支持可变形式!

创建可变切片的方式如下:

#![allow(unused)]
fn main() {
let mut numbers = vec![1, 2, 3];  
let slice: &mut [i32] = &mut numbers;
}

之后,你就可以通过这个可变切片来修改其内部元素:

#![allow(unused)]
fn main() {
slice[0] = 42;
}

这样就将 Vec 中的第一个元素改为了 42。

限制

在使用不可变借用时,规则相对明确:推荐优先采用切片引用(如 &[T])而非容器本身的引用(如 &Vec)。然而,在可变借用的场景下,情况有所不同。

思考以下示例:

#![allow(unused)]
fn main() {
let mut numbers = Vec::with_capacity(2);  
let mut slice: &mut [i32] = &mut numbers;  
slice.push(1);
}

这段代码将无法通过编译!原因在于,push 方法是属于 Vec 的,而不是切片的。这反映了一个普遍原则:Rust 不允许直接通过切片来增加或减少元素数量。你仅能修改已存在的元素内容。

从这个角度看,&mut Vec 或 &mut String 相较于 &mut [T] 或 &mut str 提供了更多的功能,因为它们允许对容器本身的结构进行修改,比如添加或移除元素。

因此,你应该根据实际需求选择最合适的类型:如果只需修改数据而不涉及容器结构变化,可使用可变切片;若需调整容器大小,则应采用容器本身的可变引用。