我有以下代码:

extern crate rand;

use rand::{thread_rng, Rng};

fn main() {
    let mut vec: Vec<u32> = (0..10).collect();
    let mut slice: &[u32] = vec.as_mut_slice();

    thread_rng().shuffle(slice);
}

并得到以下错误:

error[E0308]: mismatched types
 --> src/main.rs:9:26
  |
9 |     thread_rng().shuffle(slice);
  |                          ^^^^^ types differ in mutability
  |
  = note: expected type `&mut [_]`
             found type `&[u32]`

我想我知道向量和切片的内容是不可变的,这导致了这里的错误,但我不确定.

as_mut_slice的签名是pub fn as_mut_slice<'a>(&'a mut self) -> &'a mut [T],所以切片应该是可变的,但不知为什么它不是.

我知道一定有一个简单的解决办法,但我尽了最大努力,还是没能让它起作用.

推荐答案

兰特v0.6

Rng::shuffle方法现在已被弃用;应该使用rand::seq::SliceRandom个特征.它在所有切片上提供shuffle()方法,该方法接受Rng实例:

// Rust edition 2018 no longer needs extern crate

use rand::thread_rng;
use rand::seq::SliceRandom;

fn main() {
    let mut vec: Vec<u32> = (0..10).collect();
    vec.shuffle(&mut thread_rng());
    println!("{:?}", vec);
}

on Playground.

原始答案

你很接近.这应该是有效的:

extern crate rand;

use rand::{thread_rng, Rng};

fn main() {
    let mut vec: Vec<u32> = (0..10).collect();
    let slice: &mut [u32] = &mut vec;

    thread_rng().shuffle(slice);
}

&mut [T]可以隐式地强制为&[T],而您用&[u32]注释了slice变量,因此切片变得不可变:&mut [u32]被强制为&[u32].mut关于变量的定义在这里是不相关的,因为切片只是borrow 到其他人拥有的数据中,所以它们没有继承的可变性——它们的可变性被编码在它们的类型中.

事实上,你根本不需要对slice进行注释.这同样有效:

extern crate rand;

use rand::{thread_rng, Rng};

fn main() {
    let mut vec: Vec<u32> = (0..10).collect();
    let slice = vec.as_mut_slice();

    thread_rng().shuffle(slice);
}

甚至不需要中间变量:

extern crate rand;

use rand::{thread_rng, Rng};

fn main() {
    let mut vec: Vec<u32> = (0..10).collect();
    thread_rng().shuffle(&mut vec);
}

你应该阅读The Rust Programming Language,因为它解释了所有权和借贷的概念,以及它们如何与可变性相互作用.


Rust相关问答推荐

如何在 struct 中填充缓冲区并同时显示它?

如何从Rust记录WASM堆内存使用情况?

收集RangeInclusive T到Vec T<><>

如何从接收&;self的方法克隆RC

如何最好地并行化修改同一Rust向量的多个切片的代码?

何时可以在Rust中退出异步操作?

什么时候和为什么S最好是按值或引用传递简单类型

当对VEC;U8>;使用serde_json时,Base64编码是保护空间的好方法吗?

`*mut[T]`与`*mut T`的区别

在0..1之间将U64转换为F64

如何在Rust中缩短数组

如何获取光标下的像素 colored颜色 ?

我可以禁用发布模式的开发依赖功能吗?

Google chrome 和 Apple M1 中的计算着色器

Rust Redis 中的 HSET 命令问题

为什么 i32 Box 类型可以在 Rust 中向下转换?

为什么可以从闭包中返回私有 struct

将 (T, ()) 转换为 T 安全吗?

如何用另一个变量向量置换 rust simd 向量?

类型参数不受 impl 特征、自身类型或谓词的约束