59、Mutable slices(可变切片)
Mutable slices(可变切片)
每当我们谈论切片类型(如str
和[T]
)时,我们使用的都是他们的不可变借用形式(&str
和&[T]
)。
但是切片也可以是可变的。
这是关于如何创建可变切片的例子:
let mut numbers = vec![1, 2, 3];
let slice: &mut [i32] = &mut numbers;
然后我们可以修改切片中的元素:
slice[0] = 42;
这将会把Vec
中的第一个元素改为42
。
局限性
在使用不可变借用时,建议是很明确的:优先使用切片引用而不是对所拥有类型的引用(例如,优先使用&[T]
而不是&Vec[T]
)。
可变借用则不是这种情况。
考虑一下下面的场景:
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
更强大。
根据我们需要执行的操作选择最适合的类型。
练习
这一节的题目和上一节的差不太多,我们需要做的就是把原有的不可变切片设置为可变切片,然后我们用一个新的迭代器来原地修改数据,注意,我们不需要返回这个切片,因为原地修改了(我一开始就没注意到,然后想返回这个切片,发现不好操作)。
代码如下:
// TODO: Define a function named `squared` that raises all `i32`s within a slice to the power of 2.
// The slice should be modified in place.
// TODO:定义一个名为 squared 的函数,将切片中的所有 i32 元素平方。
// 切片应被原地修改。
pub fn squared(nums:&mut [i32]){
nums.iter_mut().for_each(|x| *x *=*x)
}
这一节的学习就先到这里了。
阅读剩余
版权声明:
作者:CN059
链接:https://www.cn059.com/2025/09/25/59%e3%80%81mutable-slices%ef%bc%88%e5%8f%af%e5%8f%98%e5%88%87%e7%89%87%ef%bc%89.html
文章版权归作者所有,未经允许请勿转载。
THE END