C++erがRustを勉強し始めると、「あれ、思ってた動きと違う」と思う事があります。
そんな時は、この投稿を参考にしてみてください。

基本moveです

ある変数を関数に渡した場合、基本moveになります(i32,f32等のプリミティブ型はコピーになる)

moveというのは、内部的にはmemcpyしているという事で、move元の方は、もう使えなくなります。

fn test(v: Vec<i32>) {
    println!("{:?}", v);
}

fn main() {
    let mut v = vec![1,2,3];  // vectorを作成
    v.push(4);  // OK
    test(v);    // ここでmoveされる!
//    v.push(5);  // もうmoveされちゃってるのでエラー
}

C++でvectorをmemcpyなんてしたら大変なことになりますが、Rustではちゃんとmove元の方を使えなくしてくれるので、問題ありません。


&(参照)の使い方がちょっと違う

Rustでは、参照を渡すときも&つける

fn test(v: &Vec<i32>) {  //参照で受け取るようにした
    println!("{:?}", v);
}

fn main() {
    let mut v = vec![1,2,3];  // vectorを作成
    v.push(4);  // OK
    test(&v);    // ここでも&をつける!
    v.push(5);  // moveされてないのでOK
}

mutはconstの反対ではない

ミュータビリティは、C++には無い概念です。
ドキュメントを読んでると、あ、constが反対になったんだなと思ってしまいがちですが、違います。

    • C++のconstは、その変数が不変である事を強制するもの

 

    Rustのmutは、これからこの変数を書き換えますよ、とコンパイラに伝えること

だいたいこんなイメージです。
※いろいろ試しているうちに、わかるようになりますので、そんなに心配しなくても大丈夫です。

[参考]
https://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/mutability.html

广告
将在 10 秒后关闭
bannerAds