Ответ 1
Ты очень близко Это должно работать:
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
с помощью &[u32]
, поэтому срез стал неизменным: &mut [u32]
был приведен к &[u32]
. mut
для переменной здесь не имеет значения, поскольку срезы просто заимствуют данные, принадлежащие кому-то другому, поэтому они не наследуют изменчивость - их изменчивость кодируется в их типах.
На самом деле, вам вообще не нужна аннотация на 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, поскольку он объясняет концепции владения и заимствования и как они взаимодействуют с изменчивостью.
Обновление: начиная с ранда v0.6.0, метод 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);
}
Смотрите это на детской площадке.