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

ho il seguente codice:Come posso creare un VEC da un intervallo e mischiarlo?

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

e ottenere il seguente errore:

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

credo di aver capito che il contenuto dei vettori e fette è immutabile e che causa l'errore qui , ma non sono sicuro.

La firma di as_mut_slice è pub fn as_mut_slice<'a>(&'a mut self) -> &'a mut [T], quindi la sezione deve essere modificabile, ma in qualche modo non lo è.

So che ci deve essere una soluzione facile, ma ho fatto del mio meglio e non riuscivo a farlo funzionare.

risposta

14

Sei molto vicino. Questo dovrebbe funzionare:

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] è implicitamente coercibile a &[T], e annotato slice variabile con &[uint], quindi la fetta divenne immutabile: &mut [uint] stato costretto a &[uint]. mut sulla variabile non è rilevante qui perché le fette sono solo prese in prestito in dati di proprietà di qualcun altro, quindi non hanno mutabilità ereditata - la loro mutabilità è codificata nei loro tipi.

In effetti, non è necessaria alcuna annotazione su slice. Questo dovrebbe funzionare così:

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

Si consiglia di leggere the official guide, spiega i concetti di proprietà e di prestito e come interagiscono con mutevolezza.

+0

vi ringrazio molto, che ha fatto il trucco per me! –

+4

Questa soluzione non è più valida, rand ora è una cassa e la funzione è chiamata 'thread_rng', non' task_rng' –

11

Si potrebbe fare qualcosa di simile:

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

} 

Ho cambiato la configurazione intorno perché range(x, y) è stato deprecato in favore di x..y e uint a favore di usize.

shuffle

Problemi correlati