LoginSignup
11
4

More than 5 years have passed since last update.

C++erがRustを勉強する時に間違えやすいポイント

Last updated at Posted at 2018-01-10

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

11
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
4