プログラミング

Rustで変数を使ってみよう!

こんにちは、MSKです。
今回からプログラミング初心者向けにRustの基本を解説していこうと思います。
まずは変数についての解説を行います。
中学校の数学で学習する変数は数学で大事な考え方です。
プログラミングでも変数とよばれるものがありますが、こちらもプログラミングで大事なものになっています。

プログラミングにおける変数

プログラミングの変数(variable)は、プログラムで使用する何かしらの値を入れておく箱のようなものです。
値を入れただけでは意味がないので、プログラミングではこの変数を使用して様々な処理を構築します。

例えば、変数を利用して計算を行ったり、プログラムの状態を表したり、ユーザーがみる画面の文字列を制御したりします。
変数がなければプログラムを構築できないといっても過言でないくらい重要なものです。
プログラミング初心者の人はまずは、変数の使い方を覚えましょう。
具体的に見ていきたいと思います。

Rustにおける基本の変数

Rustの環境構築については以前の記事で解説していますので、そちらを参考に構築してください。

Rustをインストールして使ってみよう!仕事で使っているチップも今まではC言語のみ対応でしたが、近いうちにRustにも対応するといったアナウンスがでるなど組み込み系の仕事でも使用されるようになってきています。 今日はそのRustについて特徴を紹介し、定番の「Hello World」を表示したいと思います。...

Rustではletを使用して変数を宣言できます。

実際のプログラムを見ていきたいと思います。
main.rsを次のように変更してみてください。

fn main() {
    let x = 10;
    println!("x is {}" , x);
}

cargo buildによりコンパイルを行い、コンパイルが完了したらcargo runで実行します。

実行結果

x is 10

letで宣言されているxが変数になります。
let x = 10;
この宣言では「xを変数として使うよ!xの値は10だよ!」ということを宣言しています。
変数に値を入れるには=を使います。
(Rustではxを10に束縛するという言い方をします。)

println!で()の中の文字列をコンソール画面に出力します。
{}はプレースホルダーというもので、{}は文字列を出力するときにxの値に置き換えられます。

「束縛」という言葉からも分かる通り、Rustでは基本的に変数の値を変更しないことが求められています。

実験として、次のように変数の値を変更してみます。

fn main() {
    let x=10;
    println!("x is {}" , x);
    x = 20;
    println!("x is {}" , x);
}

実行結果

error[E0384]: cannot assign twice to immutable variable x
–> src/main.rs:4:5
|
2 | let x=10;
| –
| |
| first assignment to x
| help: make this binding mutable: mut x
3 | println!(“x is {}” , x);
4 | x = 20;
| ^^^^^^ cannot assign twice to immutable variable

error: aborting due to previous error

For more information about this error, try rustc --explain E0384.
error: could not compile xxx.

このようにコンパイルの時点でエラーになります。

値を変更できる可変変数を使ってみる

プログラミングを行うときに、変数の値を変化させながら処理を記述することが一般的です。

Rustではletにより変数宣言をした時から変数の中身を変えることができません。
これではプログラムを書くことが難しくなってしまいます。

変数の中身を変える方法がないか?というと、実はあります。
上のコンパイルエラーの文を見ると、「help: make this binding mutable: mut x」とあると思います。

結論からいうと、mutをつけることにより入っている値が変更可能な変数を作ることができます。
例で見てみます。

fn main() {
    let mut x = 0;
    println!("x = {}",x);
    x = 10;
    println!("x = {}",x);
}

コンパイルして、実行してみます。

実行結果

x = 0
x = 10

今回はコンパイルエラーもなく、実行すると変数の値が変わっていますね。

シャドーイング

C/C++には見られないRustの機能として、「シャドーイング」というものがあります。

まずはプログラムで確認したいと思います。

fn main() {
    let  x = 100;
    println!("x is {}" , x);

    let x = 200;
    println!("x is {}" , x);
}

実行結果

x is 100
x is 200

可変変数を使った時のように変数xの値が変わっていることが確認できると思います。

ソースを見ると一度letで宣言した変数xをもう一度letで宣言しなおしています。

C/C++など多くの言語では変数を再宣言すると「変数宣言が二重に行われている」としてコンパイルエラーになります。

Rustではコンパイルが通ります。

Rustでは前の変数宣言を後の変数宣言で上書きすることができます。
この機能をシャドーイングといいます。

上のプログラムの場合、let x = 100という宣言を次のlet x = 200という宣言により上書きしているので、2回目のprintln!の時点ではxは200になっているというわけです。

この機能はテストコードなどを書く際には便利になってきます。

一方、Rustが基本の変数宣言では変数を変更不可にしているのに、この機能を多く使うことはRustの設計思想から外れてしまうので、テストコードやサンプルコード以外では使うべきではないと感じます。

まとめ

Rustで変数を使う方法を解説してきました。

  • letを使用して変数を宣言できる
  • Rustでは基本、変数の値を変更することができない
  • 変数の値を変更するためには、変数宣言する際にmutをつける
  • 変数を再宣言することで変数の中身を変えることができる(シャドーイング)

最後までご覧頂き、ありがとうございます。

以上、「Rustで変数を使ってみよう!」でした。

ABOUT ME
MSK
九州在住の組み込み系エンジニアです。 2児の父親でもあります。 数学やプログラミングが趣味です。 最近RustとReact、結び目理論と曲面結び目理論にはまっています。