55

次のコードがあります。

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_slicepub fn as_mut_slice<'a>(&'a mut self) -> &'a mut [T]であるため、スライスは変更可能である必要がありますが、どういうわけかそうではありません。

簡単な修正があるに違いないことはわかっていますが、最善を尽くしましたが、機能させることができませんでした。

4

2 に答える 2

83

ランド 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);
}

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]注釈を付けたので、スライスは不変になりました:に強制されました。スライスは他の誰かが所有するデータへの借用にすぎないため、可変性は継承されていないため、可変性はその型にエンコードされているため、変数の on はここでは関係ありません。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を読む必要があります。


于 2014-09-25T09:46:36.420 に答える