はじめに
この記事は感じたことをそのまま書いています。
プログラマーの幸せはコンパイラが未然にバグを防いでくれるためにエラーを吐いてくれるだと私は思っています。実行時にエラーやバグが起こってしまうのは致命的だと思っています。
Rustは良い言語だなと常に思わされます。
私はプログラミングの世界をもっと広く知りたい、自分のスキルを上げたいと思いRustを勉強し始めました。
以前Rustについての記事を書きました。
この記事を書いてから多忙によりRustに触れる時間が少なくなってしまい前にやったドキュメントの内容を忘れたので改めて読むことにしました。
今回は3章の感想を書きます。
Rust日本語版ドキュメント
3章の感想
3章はプログラミングの概念を説明しています。
プログラミングを始めて間もない人でも読むべきと思ったくらいです。
- 変数
- データ型
- 関数
- コメント(今回は触れない)
- 制御フロー(条件分岐やループ)
上記のことが記載されています。
変数
変数は以前も書きました。
変数には不変変数と可変変数があります。
他の言語では再代入を目的としていないのになんらかのミスで代入してしまうことがあると思います。
Rustではデフォルトが不変変数となっており
let x = 5;
とすると、これ以降再代入ができなくなります。
コンパイラに怒られるのです。
再代入を目的とする変数であれば
let mut x = 5;
とします。
意図しないバグが起こらないようにコンパイラが防いでくれるのはとても良いと読むと毎回思います!
この章ではこのような言葉が書いてありました。
コンパイルエラーは、イライラすることもあるものですが、まだプログラムにしてほしいことを安全に行えていないだけということなのです。 エラーが出るからといって、あなたがいいプログラマではないという意味ではありません! 経験豊富なRustaceanでも、コンパイルエラーを出すことはあります。
どうでしょう。
私はこの言葉とても好きです。
プログラマーたちに勇気をつける言葉ではないかなと思います。
プログラミングを始めた頃はエラーを出さごとに落ち込んでいましたが今ではエラーありがとう!助かりますと思うくらいです。エラーとはお友達でずっといたいものですね。
データ型
次にデータ型です。
要は型です。
こちらも前回書きました。
かなり丁寧に書かれていて良いと思いました。
- 整数
- 浮動小数点
- 論理値
- 文字
- タプル
- 配列
全て書くわけではないですが、整数型ではi32やu32など全部で10個の型の説明が書いてありますがそこには2進数や補数表現、メモリ等がわかっていないと理解することは困難なのかなと感じます。
しかし、出てくる言葉一つひとつ知らないものに対して向き合うことができれば時間をかけてでも基盤はできてくると思っています。
文字型ではアスキーだのユニコードだのという単語が出てきます。コンピュータは0と1の世界なので0と1に分けられ、各文字は0と1だけで決められた値がありその値に応じで私たちが見える形に変換されて表示されています。
文字は我々の世界では、呼吸をするように使っていますが、コンピュータの世界ではなかなか複雑であり、プログラマは悩むことが多々あるのではないかと思います。
配列では、言葉自体は多くの言語で出てくると思いますが、概念自体あまりわかっていない人がいるなと思っています。昔の自分も勘違いしていました。
配列の全要素は、 同じ型でなければなりません。Rustの配列は、他の言語と異なっています。Rustの配列は、 固定長なのです: 一度宣言されたら、サイズを伸ばすことも縮めることもできません。
Rustの配列は正真正銘の配列と言って良いと思っています。伸び縮みができるのは理論上リストだと思っています。
始めて読むとこの辺も🧐なるほど!となる人も少なくないのではないでしょうか。
さらにメモリというワードが出てきます。大半の人がメモリを気にせずやってきたのではないでしょうか?GCの言語が大半なのかなと思っていますのでメモリをほじるCなどの言語はあまり触らないかなと思っています。
関数
関数は経験豊富な方ならお手のものという感じでしょう。しかしここでは文と式が出てきます。
もう文と式は使っています。文とは、なんらかの動作をして値を返さない命令です。 式は結果値に評価されます。
他の言語でも、文と式を意識すると可読性の高いソースが書けると個人的には思っています。
制御フロー
複雑な処理を書いていく上で必要なループや条件分岐です。
条件分岐では
if number < 5 {
println!("condition was true");
// 条件は真でした
} else {
println!("condition was false");
// 条件は偽でした
}
のように書きますが、驚いたのはnumber < 5 の部分のルールです。
if number {
println!("condition was true");
// 条件は真でした
}
というのは許されないのです。
他の言語ではこのようなことをよくやると多いますが、型に厳しいRustは絶対Boolでないとダメと厳しいルールが設けられています。
慣れてないとうっかりやってしまいそうです。
ループについてはRustではloopやwhile、forが用意されていますが、それぞれどの場面でどう使うのかというのを考えさせられました。
私の考えですが、
- シンプルな終了条件の時は
while - 終了条件が複数ある場合は
loop - 回す回数が決まっている場合は
for
としますかね。
みなさんだったらどうするでしょうか?
ここまでが3章の概要と感想ですが、基礎的な部分で疎かにできない部分ですが、疎かにしてしまいがちな部分です。成長するためにはここの部分をじっくりやることかなって思います。
まとめ
3章の概要と感想を書いてきましたが、基礎的で簡単だからどうせできると疎かにしていたら痛い目を見ます。
Rustは特に難しい言語ですし、簡単に正常通り動くプログラムを書くことができません。今まで動けばいいやでソースコードを書いてきた人にとってはRustはハードルがさらに高い言語となっているのではないでしょうか?
しかし、慣れればルールが厳密な分、安全でバグの少ない読みやすいソースコードが出来上がり保守もしやすくなるのではないかと思います。
仮にRustを現場で使わないとしても、Rustで意識することを他の言語でも継承するということはできると思います。
AIが進化している近年ですが、基礎基本はAIに作業させるとしても大事なことになるので基礎基本を固めるためにもRustは良い言語ではないかと思います。
3章は多くのプログラマが読むべきと思う内容でした。
気分にもよりますが、4章は所有権でRustをやる上で重要な単元なので書ければ書こうと思います。
4章を読むにはメモリについてを軽く予習しておくと良いかなと思います。