Rustの環境構築する

インストール:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

インストールしたもの一覧
-
rustup
: いろんなツールをまとめてるやつ? - Cargo(
cargo
): ビルドシステム兼パッケージマネージャ -
rustc
: コンパイラ - clippy(
cargo-clippy
): Linter -
rustfmt
: フォーマッター -
rustdoc
: JSDocみたいなコメントを書くと、HTMLのドキュメントを生成してくれるやつ
しばらくはrustc
を使うことになりそう?

Hello World!:
fn main() {
println!("Hello World!")
}
- 拡張子は
.rs
-
fn main()
がエントリーポイント - Zennのハイライトは
rs
じゃなくてrust
でつく

Cargoを使う
プロジェクトを新規作成:
cargo new hello-world
ここでのhello-world
は新しく作られるフォルダ名になる
.
は指摘できなかった...

本では今後Cargoを使うらしい
少し見た感じでも便利そうだし、rustc
の出番は終わりかな
Cargoはビルドツールなので、内部でRustのコードをコンパイルしてくれる
当然と言えば当然だけど、コンパイルにはrustc
を使ってるらしい
rustc
には今後Cargoの内部でがんばってもらうことにしよう
なお、おそらくCargoはScalaのsbtみたいなやつ
役割が似てる気がする

cargo new
では以下のファイル / フォルダが作られる
-
.gitignore
:/target
と書かれている-
/target
はコンパイルしたバイナリ置き場
-
-
Cargo.toml
: 設定ファイル- JavaScriptの
package.json
みたいなやつ - 今後ロックファイルも登場するらしい
- JavaScriptの
-
src
: ソースコード置き場- Hello World!が書かれた
main.rs
が置かれている
- Hello World!が書かれた

コードの実行: cargo run
cargo run
Compiling hello-world v0.1.0 (略/rust/hello-world)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.27s
Running `target/debug/hello-world`
Hello, world!

cargo run
はコンパイルと実行を同時にやってくれるやつ
もし過去にコンパイルしたときとコードが変わってなければ、新たにコンパイルはせず実行だけする
cargo run
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.00s
Running `target/debug/hello-world`
Hello, world!
sbt
にも似たようなのがあった気がする

cargo build
でコンパイルとかビルドだけやってくれる
こちらは実行されない

build
とrun
ともに、デフォルトだとデバッグ用の機能が入ったものが生成される
これは開発時には役立つ...らしい
--release
オプションをつけると本番向けにコンパイルできる
また、コンパイルしたものは例えばtarget/release/hello-world
コマンドで実行できる

複数行に跨ぐ処理を書くなら文末に;
が必要
JavaScriptみたいな自動セミコロン挿入はない
fn main() {
println!("Hello World!"); // ないとコンパイルエラー
println!("Rustって所有権とか参照渡しとか難しそうだよね");
}

...いや、確か関数の最後に書いた式は戻り値になるんだっけ
だから最終行だけ特例で許されてるとかかな
(うろ覚え)
それとも式は連続して書けないとかかな(わからない)
普通に式文が許されるのは最終行だけとかかな

VSCodeでRustを書くなら、rust-analyzer拡張機能を使うらしい
たぶん型エラーとかも出してくれるはず

tomlの拡張機能もある
Cargoの設定ファイルは.toml
なので、こちらも必須だと思われる
また、右下のスキーマからCargo Manifest
を選ぶといい
Cargo Make
ではないので注意
ファイルとスキーマの関連付けはevenBetterToml.schema.associations
から管理できる
これはキーがファイルを示す正規表現、値がスキーマへのURLになっている
"evenBetterToml.schema.associations": {
".*/Cargo\\.toml": "https://json.schemastore.org/cargo.json",
}

なんでこんな割とどうでもいいところに結構な時間費やしてるんだろ...
いやでも情報なかったから苦戦するのも仕方がないっていうか...
というかJSONスキーマなんてあったんだ、これすごいな

- スキーマが適用されたか調べるには、ただリロードするだけじゃなくて少し編集してみる
- 正規表現はVSCodeのファイルパターン(
**/Cargo.toml
)ではない -
.
をエスケープするには\
が2つ必要

インデントを変更する
デフォルトのインデントは4
なので、これを普段使ってる2
にしたい
そんなときはtab_spaces
オプションを使う
- フォーマットは
rustfmt
コマンドが担っている -
rustfmt
は--config
オプションに続けてtab_spaces
などの設定を書ける- この設定は
キー=値
形式になっているので、今回はtab_spaces=2
とする
- この設定は
-
cargo fmt
でフォーマットする場合、rustfmt
のオプションは--
のあとに書く- 例:
cargo fmt -- --config tab_spaces=2
- 例:
追記: .rustfmt.toml
もあるらしい

rust-analyzerではsettings.json
からrustfmt
のコマンドライン引数を設定できる
引数はそれぞれ区切る必要があるので、GUIから設定するならそこに注意
なお、複数の引数を一つの項目に書いてしまう(["--config tab_spaces=2"]
状態)の場合、フォーマットが正常に効かなくなる
これがインデントだけだったのか全体だったのかは知らない

自分の環境では何も設定しなくても自動でフォーマッタがrust-analyzerになった
だけど、もしかしたらそうじゃない環境もあるかもしれない
設定が効かない場合はそこをチェックする必要もありそう

参考
フォーマットのオプションまとめ

追記: VSCodeのインデントの設定も重要
ここが4
だとフォーマッタと噛み合わず、よくわからないことになるので注意
変えるならeditor.tabSize
も一緒に変えよう
共通設定の .editorconfig をサポートしていないのに驚きました。

@juner 情報ありがとうございます!
ということは、VSCodeとrustfmt
で同じ設定が必要なのは避けられないのでしょうか...?
どちらも.editorconfig
を参照してくれればいいのですが、rustfmt
は実装しないみたいですし。
rustfmt 自体は参照しませんが .editorconfig を 見る crate ? はあるみたいですね。(rustfmt の設定を生成するとかもあるみたい?

本の2章はこれで終わりみたい
1章がまだだから、次は先にそっちに目を通したい