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);

它将不会被编译。

 

pushVec上的一种方法,而不是切片上的方法。这体现了一个更普遍的原则: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)
}

 

这一节的学习就先到这里了。

 

阅读剩余
THE END