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