2014-09-25 2 views
8
$ rustc --version 
rustc 0.12.0-pre-nightly (a6758e344 2014-08-19 23:56:02 +0000) 

Ich habe den folgenden Code:Wie erstelle ich ein Vec aus einem Bereich und mische es?

use std::rand::{task_rng, Rng}; 

let mut vec: Vec<uint> = range(0u,10u).collect(); 
let mut slice: &[uint] = vec.as_mut_slice(); 

task_rng().shuffle(slice); 

und erhalten die folgenden Fehler:

<anon>:6:24: 6:29 error: cannot borrow immutable dereference of `&`-pointer `*slice` as mutable 
<anon>:6  task_rng().shuffle(slice); 

Ich glaube, ich verstehe, dass der Inhalt von Vektoren und Scheiben unveränderlich ist und dass bewirkt, dass der Fehler hier aber ich bin unsicher.

Die Signatur von as_mut_slice ist pub fn as_mut_slice<'a>(&'a mut self) -> &'a mut [T], also sollte die Scheibe veränderbar sein, aber es ist irgendwie nicht.

Ich weiß, dass es eine einfache Lösung geben muss, aber ich habe mein Bestes versucht und konnte es nicht zum Laufen bringen.

Antwort

14

Sie sind sehr nah dran. Dies sollte funktionieren:

use std::rand::{task_rng, Rng}; 

let mut vec: Vec<uint> = range(0u,10u).collect(); 
let slice: &mut [uint] = vec.as_mut_slice(); 

task_rng().shuffle(slice); 

&mut [T] implizit &[T] ist coercible, und Sie slice Variable mit &[uint] kommentiert, so dass die Scheibe unveränderlich wurde: &mut [uint] wurde &[uint] gezwungen. mut auf die Variable ist hier nicht relevant, da Slices nur in Daten von jemand anderem ausgeliehen werden, so dass sie nicht vererbte Mutabilität haben - ihre Veränderlichkeit ist in ihren Typen codiert.

In der Tat benötigen Sie keine Anmerkung auf slice überhaupt. Dies sollte auch funktionieren:

use std::rand::{task_rng, Rng}; 

let mut vec: Vec<uint> = range(0u,10u).collect(); 
let slice = vec.as_mut_slice(); 

task_rng().shuffle(slice); 

Sie sollten the official guide lesen, es erklärt die Konzepte der Eigentums- und Anleihe- und wie sie interagieren mit Wandelbarkeit.

+0

danke Ihnen sehr, dass der Trick für mich getan hat! –

+4

Diese Lösung ist nicht mehr gültig, rand ist jetzt eine Kiste und die Funktion heißt 'thread_rng', nicht' task_rng' –

11

Man könnte so etwas tun:

extern crate rand; 

use rand::Rng; 

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

} 

ich das Setup um sich verändert, weil range(x, y) hat sich für x..y und uint für usize veraltet.

shuffle

Verwandte Themen