Rust を触った上で困惑したこと

背景

 ユークリッド互除法を Rust で書いてみた上でハマった点があったのでいくつか覚書して置きます.
先に言っておきますが, 諸々の事情で C++er が Rust を始めて困惑したこと集みたいになっているので悪しからず...
別に「Rust のここがダメ! 」とか言いたいわけではありません.

ハマりポイント

1. 変数がデフォルト, イミュータブル

イミュータブルとは変更できないと言う意味なのですが, 以下の様なプログラムはコンパイルエラーになってしまいます。

// コンパイルエラーになる例

let a = 100;
a += 20; // 変更するとエラー

変更したい変数には mut をつけます. mut はミュータブルの略です.

let mut a = 100;
a += 20;

 

2. 三項演算子が使えない

let a = 10 > 2 ? 1 : 2; // expected one of `.`, `;`, `?`, or an operator here

条件文 ? val1 : val2 ではなく以下の様に if 条件文 { val1 } else { val2 } の様に書きます.

let a =  if 10 > 2 { 1 } else { 2 };

ちなみに, Rust では条件文に () をつけません. つけると次の様な警告が出ます help: remove these parentheses

3. シャドーイング

let a = 20;
{
    let a = a * 10; // シャドーイング
    println!("a: {}", a); // 200
}

println!("a: {}", a); // 20

let a = a / 10; // シャドーイング
println!("a: {}", a); // 2

「こいつ, 動くぞ!」ってなりました. シャドーイングは既存の格納先を無視して新しい格納先を変数に入れ込む方法の様です. スコープを外れると元の参照先になるので, 破棄しているわけではなさそうです.

他, 参考になりそうな記事

qiita.com qiita.com