Rust学習帳
DenoがGoではなくてRustになったりしたのと、GoよりもWASMのバイナリが小さいとか聞いて、Rustに興味を持ってたので、Rustをさわり始めようと思います。
初心者です。優しくしてね!
さて、全く分からないところでググったりあれこれしてとりあえず僕がたどり着いた結論として、まずは
- 公式の「はじめに」で、インストールから動作まで試す
- The Rust Programming Language を読んで、Rust について覚える
でいいようです。
本を買うにしても、Amazon のレビューとか読んでると、The Rust Programming Language(日本語版もある)を読んでからがスタート地点っぽい。
公式の「はじめに」から
はじめに に至れり尽くせりであれこれ書いてます。
Rust Playground で、Rust をインストールせずに試してもいいんだけどまぁせっかくなのでインストールします。
インストールする
公式で、rustup というインストール&バージョン管理ツールを使うのが推奨されてる。なんて優しいの!
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
適当にエンター押してればインストールされる。
stable installed - rustc 1.47.0 (18bf6b4f0 2020-10-07)
Rust is installed now. Great!
To get started you need Cargo's bin directory ($HOME/.cargo/bin) in your PATH
environment variable. Next time you log in this will be done
automatically.
To configure your current shell run source $HOME/.cargo/env
って書いてるので、~/.bash_profile
とか ~/.zshrc
とかその手の起動時に読み込むファイルに source $HOME/.cargo/env
を追加しましょう。
exec $SHELL -l
を実行するか、ターミナルを閉じて開き直すと cargo
が使えるようになってます。
Rust では、プロジェクトの作成、ビルド、実行など全部 cargo
コマンド経由でやるっぽいです。
あとついでに、公式のVSCode拡張 が推奨されてますが、個人的に試した感じでは rust-analyzer - Visual Studio Marketplace の方が、補完が効いてよさそうです。
プロジェクトを作成してみる
公式に書いてるとおり、プロジェクトを作成してみます。
$ cargo new hello-rust
$ cd hello-rust
感覚としては最近よくある、プロジェクト管理してくれる CLI ツールっぽい挙動ですね。
Cargo.toml
っていうプロジェクト設定の必須ファイル(Node.jsでいうpackage.jsonか)と、src/main.rs
っていうファイルが出来上がっていて、なおかつ git が初期化されています。
VSCode で開いてエラーが出る
VSCodeで Rust のファイルを開くと「couldn't start client Rust language server」などというエラーが出ます。
これは、VSCode 自体が、rustup を見つけられないためのエラーらしく、issue を参考にして、VSCodeのRust-client: Rustup Path
を$HOME/.cargo/bin/rustup
に設定します。
そのあと VSCode で開き直すと「色々インストールされてないからインストールするで」的なメッセージが出るので Yes を推すと、いい感じにインストールされます。
動かしてみる
最初から main.rs
に
fn main() {
println!("Hello, world!");
}
っていうコードが既に書いてあるんで、コマンドラインで cargo run
って実行するだけです。
パッケージを使う
これも、もう公式をなぞるだけです。
それらが終わると、Rustaceanになれたらしいので、もっと学ぼうにアクセスするといいらしいです。と言っても、公式リソースのリンク集なので、次に読むべきものは、
「the book」としても親しまれているプログラミング言語Rustは、この言語の概観を基本原理から説明します。読み進める中で複数のプロジェクトを構築し、読み終わるまでにはこの言語の確かな理解が得られます。
The Rust Programming Language を読めと指示されるんですが、The Rust Programming Language 日本語版 - The Rust Programming Language 日本語版もあるので、そっちを読んでみるとします。
The Rust Programming Language(日本語版)を読む
Rustのファイルは常に .rsという拡張子で終わります。 ファイル名に2単語以上使っているなら、アンダースコアで区切ってください。例えば、helloworld.rsではなく、 hello_world.rsを使用してください。
なるほど。Rustのファイル名はスネークケース(アンダースコア区切り)なのね。
疑問として、なんでソースコードはhello_world.rs
のような小文字・アンダースコアなのに、Cargo.toml
は、大文字始まりなの……。どうしてそこだけそういうファイル名にしたし。
Rustのスタイルは、タブではなく、4スペースでインデントするということです。
VSCode を使っていれば、CMD+Shift+F で勝手にフォーマットできるはずなので、機械任せでOK。
println!はRustのマクロを呼び出すということです。代わりに関数を呼んでいたら、 println(!なし)と入力されているでしょう。
ほう println!()
はマクロ呼び出しなのね。マクロとか C 以来だわー。
サンプルコードを入力してみた感じ、あまり VSCode のサジェストが働かないっぽい?これはちょっとVSCode+TypeScriptに慣れきった身体では辛いかも。どうも、公式の Rust Extensions はあまりよくないっぽい?標準の Rust extension 0.7.8をdisable にして、rust-analyzer - Visual Studio Marketplaceに乗り換えたら、いい感じにサジェストされるようになった。
配列が固定長。スクリプト言語ばかり触ってるとあまりメモリの気持ちになることもないとは思うので感覚がおかしくなるけど、パフォーマンスを考えると必要なやつ。
配列の範囲外アクセスを検出して panic で落ちるのはいいと思う。アクセスできてしまうとセキュリティホールなりなんなりにつながるので。
所有権は、一度読んだだけではなかなか理解しづらい感じ。一杯疑問は思い浮かぶんだけど、一通り全部読んでから考えた方がよさそう
前回からめっちゃ時間が空いたけど、最近ちょっとRustで作りたいものができたので、再開
改めて読むと、個人的には、戻り値は ;
をつけず、文には ;
を付けるというのは、なんか頭いいなと思いつつ、めちゃくちゃ気持ち悪い
文字列の場合 let s = String::from("Hello")
みたいなのが頻出してるけど "hello".to_string()
のほうが短くて便利なのでは????
まぁ文字列に見えるものに to_string()
ってなんぞみたいな気持ちになるけど、それは String::from
でも同じ
8-2 まで読んだ。
ある関数を定義するときのライフスタイル注釈って、デフォルトで付けとけばいいのでは?????
ライフサイクルがよくわかってないところあるけどまぁこればっかりは実際に手を動かさないと理解しづらそう
せっかくなので volta のソース読むかなーという気持ち
Rust のコード、アノテーションが多いの、なんかモニョる感覚が少しだけ