😸

#2 事始め【知識0がRustやってみる】

2024/04/07に公開

【第1章 事始め】

よろしくお願いします!

Rustのインストール

インストール方法は不要かなと思ったんですが、どの記事でもしっかり書いてあるので少し端折って書きます。

素のWindowsの場合

Windowsの場合は少し面倒でRust公式からインストーラーをダウンロードし、手順に沿ってインストール語、Rustのコンパイルに必要なC++のビルドツールをインストールするらしい。

Mac または Linux または Windows System for Linux (WSL2)の場合

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

筆者の場合、WindowsですがDockerを使うついでにWSL2の環境があったのでLinuxでインストールしました。

Ubuntu20.04
rustup --version

正常にバージョンが表示されればOKです。
rustup 1.27.0 (bbb9276d2 2024-03-08)
ちなみにrustupとはrustのバージョン管理ツールのようなものらしい。

ついでにRustのビルド&パッケージマネージャーのCargo君も一緒に入っているか確認します。

Ubuntu20.04
cargo --version

cargo 1.79.0-nightly (499a61ce7 2024-03-26)

プロジェクトのセットアップ

適当なフォルダでターミナルを開き、
cargo new プロジェクト名
もしくはフォルダを作成しそのフォルダで
cargo init
とコマンドをたたくとCargo君が初期プロジェクトを作成してくれます。

Ubuntu20.04
cargo new rust-setup
cd rust-setup
tree
.
├── Cargo.toml
└── src
    └── main.rs

1 directory, 2 files

treeコマンドは別途インストールしてください。
神です。sudo apt install tree

Hello World!

生成されたソースコードはこんな感じ。

main.rs
fn main() {
    println!("Hello, world!");
}
Cargo.toml
[package]
name = "rust-setup"
version = "0.1.0"
edition = "2021"

[dependencies]

まずはmain.rsfnは関数宣言で、println!は標準出力であることがわかりますね。

次にCargo.toml、packege.jsonのような依存関係をまとめたファイルでしょうか。
edition = "2021"がなんで2021なのか気になりますがスルーします。

あれ..よく見たらmain.rsprintln「 ! 」なんやこれ.....

2番目にprintln!はRustのマクロを呼び出すということです。代わりに関数を呼んでいたら、 println(!なし)と入力されているでしょう。Rustのマクロについて詳しくは、第19章で議論します。 とりあえず、!を使用すると、普通の関数ではなくマクロを呼んでいるのだということを知っておくだけでいいでしょう。

ほう...マクロ......
簡単に言えばコンパイル時にコードを生成するコードだそう。
rustでは「!」があればマクロであることを表しているらしい。
println!ではメリットがわからないけど、今後のマクロに期待ですな。

main関数

rustはmain.rsのmain関数が最初に実行されます。
先ほどcargo newで作成したプロジェクトでは既に挨拶の準備が整ってますね。

main.rs
fn main() {
    println!("Hello, world!");
}

さっそく実行してみます。
実行はcargo runというコマンドを叩きます。

rustはコンパイラ言語なのでバイナリへビルドしてから実行する必要がありますが、cargo runコマンドは開発をスムーズに行うために、ビルド→実行を順番に処理してくださいます(たぶん)

......とりあえず実行します。

$ cargo run
   Compiling rust-setup v0.1.0 (/home/user/linux_workspace/rust-setup)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.31s
     Running `target/debug/rust-setup`
Hello, world!

Hello!!

Rustプログラマになったのです!ようこそ!

Rust Bookではここの時点でRustプログラマとして認めてくれます、なんて優しい。

Cargoはめちゃくちゃ素敵で、cargo run以外にも

cargo newを使ってプロジェクトを作成できる
cargo buildを使ってプロジェクトをビルドできる
argo runを使うとプロジェクトのビルドと実行を1ステップで行える
argo checkを使うとバイナリを生成せずにプロジェクトをビルドして、エラーがないか確認できる

なんて素敵なんだ。
ちなみにRustのコンパイラはめちゃくちゃ優秀で、エラーの際に詳細なエラーメッセージと解決策を提示してくれる。

物は試しで、先ほどのprintln!!を消して実行してみます。

main.rs
fn main() {
    println("Hello, world!");
}
   Compiling rust-setup v0.1.0 (/home/user/linux_workspace/rust-setup)
error[E0423]: expected function, found macro `println`
 --> src/main.rs:2:5
  |
2 |     println("Hello, world!");
  |     ^^^^^^^ not a function
  |
help: use `!` to invoke the macro
  |
2 |     println!("Hello, world!");
  |            +

For more information about this error, try `rustc --explain E0423`.
error: could not compile `rust-setup` (bin "rust-setup") due to 1 previous error

このエラーメッセージだけで、

  1. src/main.rs:2:5でエラーを検知しました。
  2. printlnは関数ではありません。
  3. マクロを呼び出すには「!」を使用してください。
  4. ここへ「!」入れてください。
  5. このエラーに関しては rustc --explain E0423 ここに詳しく書いてます。
  6. コンパイル失敗しました!!!

めちゃくちゃ親切じゃないですか?
このコンパイラ先生がいれば実行前に厳格なエラーチェック行ってくれるので、実行時の安全性を高く担保してくれます。
Pythonのようなインタプリタ言語(コードを一行ずつ解釈し機械語に変換して実行)で重たい処理を実行してかなり進んだとこで無慈悲なエラーなんてことは起こりえないわけです()

まとめ

インストールとHello Word!しかやってませんが、Rustは書いててなんかワクワクしますね。
この章では、

  • Cargoコマンドでビルド・実行・チェックなどだいたいできる
  • rustはmain関数から実行される
  • コードを生むコードのマクロなるものがある
  • 厳格なコンパイラのおかげで安全性が担保されている

など分かりました、まだ静的型付け言語である部分が出てませんね。
次の第2章は、とりあえず何か作ろう精神の「数当てゲームのプログラミング」なのですが、筆者がやった時に正直意味わからんかったし説明もなしでなんやかんや出てくるので書学者はやる必要ないと思います。

なので、飛ばして「一般的なプログラミングの概念」をやっていきます。
よろしくお願いします。

余談

実は既にチュートリアル1周終わっていて、Actix-web+sqlxでREST API開発を試してWeb Socketチャットを試すところで詰まったんですよね..
Rustは本気で身に着けたい(Rustいけたら他の言語なんでもいけんじゃね的な野望込み)ので基礎スタートからやり直すために書いてます。
自分の言葉でアウトプットして自分のため気楽にやっていきます。

参考

Rust Book
Markdown記法一覧

Discussion