我正在尝试创建一个数字为48到57的向量,然后随机随机播放它。我遇到了以下错误
error: the type of this value must be known in this context
let &mut slice = secret_num.as_mut_slice();
^~~~~~~~~~~~~~~~~~~~~~~~~
error: no method named `shuffle` found for type `rand::ThreadRng` in the current scope
rng.shuffle(&mut slice);
^~~~~~~
以下是代码:
extern crate rand;
fn main() {
//Main game loop
loop{
let mut secret_num = (48..58).collect();
let &mut slice = secret_num.as_mut_slice();
let mut rng = rand::thread_rng();
rng.shuffle(&mut slice);
println!("{:?}", secret_num);
break;
}
println!("Hello, world!");
}
答案 0 :(得分:5)
collect
需要知道您希望收集的类型。从它的外观来看,你想要一个Vec
:
let mut secret_num: Vec<_> = (48..58).collect();
您不希望在此变量的声明中使用&mut
,因为这会使slice
成为未归类的类型,而这种类型无效。事实上,这条线是多余的。
let &mut slice = secret_num.as_mut_slice();
必须将特征纳入范围。您已经获得的错误消息应该已经告诉您了。 Rust大多数时候都有很好的错误消息。你应该阅读它们:
help: items from traits can only be used if the trait is in scope;
the following trait is implemented but not in scope,
perhaps add a `use` for it:
help: candidate #1: `use rand::Rng`
根本不需要loop
;去掉它。在提问时帮助您了解问题的根源以及其他人来回答问题,请生成MCVE。在你的真实程序中,你应该在循环之前获得随机数生成器一次以避免开销。
由于您最初提出这个问题,rand重组了他们的代码。 shuffle
现已成为SliceRandom
特征的一部分。
use rand::seq::SliceRandom; // 0.6.5
fn main() {
let mut secret_num: Vec<_> = (48..58).collect();
let mut rng = rand::thread_rng();
secret_num.shuffle(&mut rng);
println!("{:?}", secret_num);
}