mimikakimemo

自分用メモ。

Rust に付け焼き刃で入門する 1

数十分〜数時間で手っ取り早く掴む系

ざくっと見てみたところ、所有権・借用や、ライフタイムの扱いがややこしそうな印象。コンパイルエラーのメッセージが親切なのはとても嬉しい。Hello World を書こうとすると、いきなりマクロ println! が出てきて「!」となる。

The Rust Programming Language

公式のこのドキュメントがまずはおすすめらしいので、以降はこれに沿って勉強してみる。TRPL あるいは the book と呼ばれているとのこと。


1. 事始め

事始め - The Rust Programming Language 日本語版

1.1. インストール

普段は Homebrew を使うことが多いが、今回はとりあえず公式にしたがってインストールする。

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

デフォルトのままで動いた。

$ rustup --version
rustup 1.23.1 (3df2264a9 2020-11-30)
info: This is the version for the rustup toolchain manager, not the rustc compiler.
info: The currently active `rustc` version is `rustc 1.50.0 (cb75ad5db 2021-02-10)`

$ rustc --version
rustc 1.50.0 (cb75ad5db 2021-02-10)

$ cargo --version
cargo 1.50.0 (f04e7fab7 2021-02-04)

公式のパッケージマネージャー cargo が一緒にインストールされるのも、楽でうれしい。

1.2. Hello, World!

hello_world/main.rshello world を書く。VS Code にはデフォルトで Rust のシンタックスハイライトが入っているようだ。

rustcコンパイルしたら、実行ファイルのバイナリができた。

$ rustc main.rs
$ file main
main: Mach-O 64-bit executable x86_64
$ ./main
Hello, world!

1.3 Hello, Cargo!

  • $ cargo new プロジェクトの作成。Git リポジトリの作成までやってくれる
  • $ cargo check 検証
  • $ cargo build [--release] ビルド
  • $ cargo run (ビルド+)実行

cargo があるので、rustcコンパイルする機会はあまりなさそう?

2. 数当てゲームをプログラムする

数当てゲームをプログラムする - The Rust Programming Language 日本語版

VS Code で写経。そのままだとフォーマットや補完ができなかったので、拡張機能を入れた。

let で変数の作成。immutable の方が無標になっているのはありがたい。

::new 行にある :: という記法は、newString 型の関連関数であることを表しています。

関連関数というのは聞き慣れない言葉。英語だと associated function。スタティックメソッドと同じようなものらしい。

io::stdin().read_line(&mut guess)

read_line に、String 型の変数 guess の参照を渡している。C 言語のポインタっぽい。可変であることが &mut で明示的に示されている。

Result 型に関しては、列挙子は OkErr です。

HaskellEither など、関数型でよくあるアレ。エラー処理が書きやすくなるのでありがたい。エラー処理が漏れていると、コンパイル時に検出できるのもうれしい。

0.3.14という数字は、実際には^0.3.14の省略記法で、これは、「バージョン0.3.14と互換性のある公開APIを持つ任意のバージョン」を意味します。

Cargo の依存の指定。実際に、手元の環境では 0.3.23 がインストールされた様子。ちなみに、クレート crate というのは木箱のことらしい。

次に、別の use 行を追加しています: use rand::Rng ですね。Rng トレイトは乱数生成器が実装するメソッドを定義していて、 このトレイトがスコープにないと、メソッドを使用できないのです。

これはわかりにくい気がする。…が、試しに use rand::Rngコメントアウトしてビルドしてみたら、

help: the following trait is implemented but not in scope; perhaps add a `use` for it:
    |
4   | use crate::rand::Rng;

という親切なメッセージが出てきた。これだったら大丈夫そうだ。

match式は、複数のアーム(腕)からできています。

パターンマッチ。

Rustでは、新しい値でguessの値を覆い隠す(shadow)ことが許されているのです。 この機能は、値を別の型に変換したいシチュエーションでよく使われます。

最初はこのシャドーイングの使いみちがわからなかったけど、そういうことか。immutable な変数が基本なので、混乱も起きなさそう。

loop, continue, break については、特に変わったところはなし。

プログラミング言語Rust 公式ガイド

プログラミング言語Rust 公式ガイド