カンテラの光の下で

dNaga392's memorandom

【Rust】Rustチュートリアルをはじめました

いまイケてる言語と噂の[要出典]Rustを触ってみました。

www.rust-lang.org

まだチュートリアル第2節の「数当てゲームをプログラムする」までしか進んでないですが、 よさが感じられたのでここで記録しておきます(チュートリアルは付録込みで21節まであります)。

比較的容易な開発環境の構築手順

プログラミングをする場合、何をやるにも最初は環境構築の壁が存在します。

Rust の場合、LinuxMacならコマンド一発な感じです。 ただ、Windowsの場合は次の依存関係があります。

記事執筆時点では、Microsoft Visual C++ Build Tools 2019 が最新です(Rust公式のインストールページにも反映されてますね)。

これはインストールページに書いてあることですが、僕みたいにうっかり読み飛ばす人は注意が必要です。

Install - Rust programming language

読みやすいチュートリアル

公式はバリバリ英語ですが、チュートリアルは日本語訳が存在します。

https://doc.rust-jp.rs/book/second-edition/

Rust のチュートリアルは、いわゆる教科書やリファレンスのような形式だったものとは異なります。

しかし、実際に動くコードを動かして、なぜそのように動くのかを一行一行、一つ一つ説明しています。 それは既知の方には退屈なくらい丁寧に述べられています。

これはどんな些細なことであってもキチンと解決させるという Rustacean (Rust開発者)の性格が見えるような気がします。

私はここが気に入ったのですが、一方で関連技術についてはあまり深く説明してないまま進めているので、 分かりやすいかは評価が分かれるだろうと感じます。

build と check が分かれている

Rust はコンパイルを実行する cargo build のほか、コンパイルできることを確かめる cargo check というコマンドを提供しています。

他のコンパイルを必要とする言語では、 コンパイルの実行でコンパイルできることを確かめています。 これは実行可能ファイルができるまでを指示するため、しばしば時間を要します。

Rust でも cargo build を実行すると同様のことは発生します。 しかし、 cargo check によりその悩みはいくらか軽減されます。

実際に開発していると、コンパイルできることを確かめたくなることがよくあるので、 cargo check は嬉しい機能です。

コンパイラのエラーメッセージ

Hello world でうっかり文字列の終了記号(")を付けそびれたとします。

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

Rust の場合、この異常を次のように関連する複数行を提示してくれます。

f:id:dNaga392:20190408232923p:plain

同様のバグコードが C++ の場合は次のようになります。関連するすべてのエラーを出しているので比べるとうるさく感じますね。

f:id:dNaga392:20190408233020p:plain

このため、親切さでは Rust がよさそうに感じます。

一方で、必ずしもわかりやすくはないとも感じました。 次のエラーメッセージでは match guess.cmp(&secret_number) の行が示されています。

f:id:dNaga392:20190408234908p:plain

しかし実際に問題があったのはそれより前の行でした。

        // 本当は次のように match をつける
        // let guess: u32 = match guess.trim().parse() {
        let guess: u32 = guess.trim().parse() {
            Ok(num) => num,
            Err(_) => continue,
        };

        println!("You guessed: {}", guess);

        match guess.cmp(&secret_number) {  // この行がエラーメッセージに出ていた
            Ordering::Less => println!("Too small!"),
            Ordering::Greater => println!("Too big!"),
            Ordering::Equal => {
                println!("You win!");
                break;
            }
        }

このあたりは C++ など他言語とおなじように慣れが必要かもしれません(勘が働くというやつですね)。

最後に

良いことと同じくらい注意したことを書いていますが、 Rust がかなり好きになりました。

なにより、公式ガイドが読んでわくわくする仕上がりになっているのがとても大きいです。

まだまだ最初の段階ですので、楽しんで読み進めて書いていきたいです。