Closed25

Rustの環境構築する

nanasinanasi

インストール:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
nanasinanasi

これで元に戻る(アンインストールされる)らしい:

rustup self uninstall
nanasinanasi

インストールできた

rustup --help
rustup 1.27.1 (54dd3d00f 2024-04-24)
nanasinanasi

インストールしたもの一覧

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

しばらくはrustcを使うことになりそう?

nanasinanasi

Hello World!:

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

println!はいつもの出力する関数
最後の!は、おそらく副作用があることを示すもの?(どこかで聞いた)

nanasinanasi

Cargoを使う

プロジェクトを新規作成:

cargo new hello-world

ここでのhello-worldは新しく作られるフォルダ名になる
.は指摘できなかった...

nanasinanasi

本では今後Cargoを使うらしい
少し見た感じでも便利そうだし、rustcの出番は終わりかな

Cargoはビルドツールなので、内部でRustのコードをコンパイルしてくれる
当然と言えば当然だけど、コンパイルにはrustcを使ってるらしい
rustcには今後Cargoの内部でがんばってもらうことにしよう

なお、おそらくCargoはScalaのsbtみたいなやつ
役割が似てる気がする

nanasinanasi

cargo newでは以下のファイル / フォルダが作られる

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

コードの実行: 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!
nanasinanasi

cargo runはコンパイルと実行を同時にやってくれるやつ
もし過去にコンパイルしたときとコードが変わってなければ、新たにコンパイルはせず実行だけする

2回目
cargo run
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/hello-world`
Hello, world!

sbtにも似たようなのがあった気がする

nanasinanasi

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

nanasinanasi

buildrunともに、デフォルトだとデバッグ用の機能が入ったものが生成される
これは開発時には役立つ...らしい

--releaseオプションをつけると本番向けにコンパイルできる
また、コンパイルしたものは例えばtarget/release/hello-worldコマンドで実行できる

nanasinanasi

複数行に跨ぐ処理を書くなら文末に;が必要
JavaScriptみたいな自動セミコロン挿入はない

fn main() {
  println!("Hello World!"); // ないとコンパイルエラー
  println!("Rustって所有権とか参照渡しとか難しそうだよね");
}
nanasinanasi

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

それとも式は連続して書けないとかかな(わからない)
普通に式文が許されるのは最終行だけとかかな

nanasinanasi

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

nanasinanasi

tomlの拡張機能もある
Cargoの設定ファイルは.tomlなので、こちらも必須だと思われる

また、右下のスキーマからCargo Manifestを選ぶといい
Cargo Makeではないので注意

ファイルとスキーマの関連付けはevenBetterToml.schema.associationsから管理できる
これはキーがファイルを示す正規表現、値がスキーマへのURLになっている

settings.json
"evenBetterToml.schema.associations": {
  ".*/Cargo\\.toml": "https://json.schemastore.org/cargo.json",
}
nanasinanasi

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

というかJSONスキーマなんてあったんだ、これすごいな

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

インデントを変更する

デフォルトのインデントは4なので、これを普段使ってる2にしたい
そんなときはtab_spacesオプションを使う

  • フォーマットはrustfmtコマンドが担っている
  • rustfmt--configオプションに続けてtab_spacesなどの設定を書ける
    • この設定はキー=値形式になっているので、今回はtab_spaces=2とする
  • cargo fmtでフォーマットする場合、rustfmtのオプションは--のあとに書く
    • 例: cargo fmt -- --config tab_spaces=2
nanasinanasi

rust-analyzerではsettings.jsonからrustfmtのコマンドライン引数を設定できる
引数はそれぞれ区切る必要があるので、GUIから設定するならそこに注意

なお、複数の引数を一つの項目に書いてしまう(["--config tab_spaces=2"]状態)の場合、フォーマットが正常に効かなくなる
これがインデントだけだったのか全体だったのかは知らない

nanasinanasi

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

nanasinanasi

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

このスクラップは25日前にクローズされました