可变切片
当我们谈及切片类型,比如字符串切片(&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 提供了更多的功能,因为它们允许对容器本身的结构进行修改,比如添加或移除元素。
因此,你应该根据实际需求选择最合适的类型:如果只需修改数据而不涉及容器结构变化,可使用可变切片;若需调整容器大小,则应采用容器本身的可变引用。