1週間Rust入門チャレンジ
諸事情で1週間でRust入門をしないといけないので、頑張ります。
Haskellぐらいしかまともに書ける言語が無いのは問題だと思っていたので、いい機会だと思ってせいぜい足掻こうかと(Haskellもまともに書けるかと言えば微妙かもしれないけど)。
サボってしまうのを防ぐためにアウトプットを同時に行うことで自分に義務を課すという方針。
目標としては、
- 最低限使えるようになる
- 簡単な競プロ問題を解けるようになる
- Haskellで言うこれはRustならこう書くのかな、ぐらいの脳内変換ができるようになる
まあ、1週間という期間設定がそもそも無理ゲーな気もするけど、とりあえずできる限りのことはします。
こうしたら良いよ、というものがあればコメントを頂ければ泣いて喜びます。
また、超初心者なので書いている事が間違っている可能性がかなり高いです。
正直誰かに教えるために書く記事というわけではなく、授業ノートのような感じだと思っていただければと思います。
もし間違いを見つけたら、コメントやツイート、編集リクエストで指摘していただけたら泣いて(ry
使う教材
1年ぐらい積ん読状態だったオライリーのRust本があるので基本的にはそれを。
後はネットの情報を漁りつつ、という感じ?
第何章とか何ページとか書いているとしたら基本的にオライリーRustのことだと思ってください。
環境
Fedora x Vimで行きます。
宗教上の理由でEmacsは使えないので。
Day 1
第1章
Rustの何が優れているのか?について
所有権、移動、借用という3つの機構を用いることでメモリ安全性と信頼できる並列性を得られるらしい。
Rustは型安全
プログラムがWell Definedであることを保証してくれるなら、その言語は型安全である
例外は未定義動作ではない
Haskellも型安全
Rustでポインタを使う事もできるが、その場合はunsafeとなる
トレイトとジェネリクス
一連の型に共通する性質を記述し、そのような共通性を利用するための簡潔で柔軟で効率の良い機能
Haskellの型クラスに相当?
第2章
Rustのインストール
cargo、rustc、rustdocを使う
cargoはコンパイルマネージャとパッケージマネージャを兼ねる
Haskellのstackやcabalに相当?
rustcはRustのコンパイラ
HaskellのGHCに相当
rustdocはドキュメンテーションツール
恐らくHaskellのHaddockに相当するはず
cargo new --bin hello
これでプロジェクトが新規作成できる。
stack new hello
みたいなものか
関数定義
fn gcd(mut n: u64, mut m: u64) -> u64 {
assert!(n != 0 && m != 0);
while m != 0 {
if m < n {
let t = m;
m = n;
n = t;
}
m = m % n;
}
n
}
なんかすごくCっぽいなあ、という印象。
Haskellだとまずこうは書かないだろうなあ。
返る値の型を表す矢印はHaskellと同じなので、そこは少し親近感。
u64はHaskellで言うWord64
mutはミュータブルで、再代入可能変数という意味らしい。
再代入、うっ、頭が......
再代入とか何年やってないだろう?
実際にはほとんどの変数は再度代入されることはない、と書いてあるので、Haskellの癖で再代入を避ける書き方になってもなんとかなりそう?
assertはマクロらしい。
引数が真であることを確認し、偽であれば理解しやすいメッセージを出してプログラムを終了する。
このような突然の終了をパニックと呼ぶ。Rustでは常にアサーションをチェックする。
なるほど。つまり、今回の場合はゼロ除算を避けるためにどちらもゼロではないことをあらかじめ確認した、という事か。
セミコロンが無い式で終わっている場合、その式が関数の返り値となる。
中括弧で囲まれたブロックは式となる。
Rustではreturn文は関数の途中で明示的に早期リターンするときにしか用いない。
これから今日中に勉強する分は随時更新します。