コース目次 / 第0章

試食 — コンパイラと話す

インストールなしで、ブラウザの中でRustのコンパイラにわざと怒られてみます。

第0章 / 全5章目安 約20分この章のゴール: 「コンパイラは敵ではなく相棒」という感覚をつかむ

インストールは要りません。そしてこの章では、わざと3回エラーを出します。

Rustの口当たりは、動いたときよりも怒られたときにいちばんよく分かります。

用意するもの

ブラウザで Rust Playground を開いてください。Rust公式の練習場です。

左上に RUN ボタン、コードを書く枠、その下に結果が出ます。結果は2つに分かれていて、Standard Error にコンパイラの言い分、Standard Output にプログラムの出力が出ます。

まずそのまま RUN を押して、Hello, world! が出ることを確かめてください。

ひと口め: 変わらないのが既定

コードを全部消して、これを貼って RUN。

Playgroundに貼る
fn main() {
    let kazu = 3;
    println!("いまの数: {}", kazu);

    kazu = 5;
    println!("あとの数: {}", kazu);
}

赤くなります。Standard Error を読んでください。

コンパイラの言い分
error[E0384]: cannot assign twice to immutable variable `kazu`
 --> src/main.rs:5:5
  |
2 |     let kazu = 3;
  |         ---- first assignment to `kazu`
...
5 |     kazu = 5;
  |     ^^^^^^^^ cannot assign twice to immutable variable
  |
help: consider making this binding mutable
  |
2 |     let mut kazu = 3;
  |         +++

最後の3行を見てください。「mut を足せばいい」と、直したあとの行そのものを見せてくれています。
Rustは「変数は既定で変えられない」という言語です。変えたいときだけ mut と宣言します。うっかり書き換える事故が起きないように、面倒なほうを既定にしてあります。

言われたとおり let mut kazu = 3; に直して RUN。

Standard Output
いまの数: 3
あとの数: 5

ふた口め: 見落としを許さない

Playgroundに貼る
enum Tenki {
    Hare,
    Ame,
    Yuki,
}

fn main() {
    for kyou in [Tenki::Hare, Tenki::Ame, Tenki::Yuki] {
        let kotoba = match kyou {
            Tenki::Hare => "洗濯物を干そう",
            Tenki::Ame => "傘を持とう",
        };
        println!("{}", kotoba);
    }
}

天気は3種類あるのに、2つぶんしか書いていません。

コンパイラの言い分(抜粋)
error[E0004]: non-exhaustive patterns: `Tenki::Yuki` not covered
  --> src/main.rs:9:28
   |
 9 |         let kotoba = match kyou {
   |                            ^^^^ pattern `Tenki::Yuki` not covered
   |
note: `Tenki` defined here
  --> src/main.rs:1:6
   |
 1 | enum Tenki {
   |      ^^^^^
...
 4 |     Yuki,
   |     ---- not covered

「Yuki を書いていませんよ」と名指しされました。これが Rust の match です。取りうる場合を全部書くまで、プログラムは動きません。
他の多くの言語なら、雪の日に何も表示されないまま静かに動きます。その静かなバグを、動かす前に潰す——これがRustの売りです。ここが第一の分かれ目で、窮屈と感じるか、心強いと感じるかが分かれます。

Tenki::Yuki => "長靴を出そう", の1行を足して RUN。

Standard Output
洗濯物を干そう
傘を持とう
長靴を出そう

み口め: 持ち主は1人

Rustでいちばん有名な仕組みに、1回だけ触ります。

Playgroundに貼る
fn aisatsu(n: String) {
    println!("こんにちは、{}さん", n);
}

fn main() {
    let namae = String::from("はると");
    aisatsu(namae);
    println!("{}さん、またあとで", namae);
}
コンパイラの言い分(抜粋)
error[E0382]: borrow of moved value: `namae`
 --> src/main.rs:8:28
  |
6 |     let namae = String::from("はると");
  |         ----- move occurs because `namae` has type `String`, which does not implement the `Copy` trait
7 |     aisatsu(namae);
  |             ----- value moved here
8 |     println!("{}さん、またあとで", namae);
  |                                    ^^^^^ value borrowed here after move
  |
note: consider changing this parameter type in function `aisatsu` to borrow instead if owning the value isn't necessary

「7行目で渡してしまったので、8行目にはもう無い」と言っています。Rustでは、値の持ち主は同時に1人だけ。関数に渡すと、持ち主ごと引っ越します。これが所有権です。
最後の note: が答えです。「持たなくていいなら、借りる形にしては」。

2か所だけ直します。n: String を n: &str に、aisatsu(namae) を aisatsu(&namae) に。

Standard Output
こんにちは、はるとさん
はるとさん、またあとで

所有権の話はここで終わりにします。Rustでいちばん時間のかかるところなので、この試食では「そういうものがある」と1回だけ体験して先へ進みます。このコースで作る道具は、ここで詰まらない形に設計してあります。

この言語の性格

感じたこと Rustの設計思想
よく怒られる 動かす前に間違いを見つける。実行時に落ちるより、コンパイル時に止まるほうがいい
直し方まで書いてある エラーメッセージは言語の一部。「相棒」と呼ばれる所以
既定が厳しい側 変えられない・持ち主は1人。ゆるくしたいときだけ自分で宣言する

ここまでで分かること

「合わないかも」と思ったなら、それも収穫です。15分で分かったなら上出来で、それがこの試食コーナーの目的です。別の言語を試すのも、まったく正しい進み方です。
「もう少し触ってみたい」と思ったなら、次の章で Rust をあなたのパソコンに入れます。ここから先は手元に残る道具を作ります。

持ち帰りに進む前に

次の章で入れるものと、かかる時間の目安です。

内容
入れるもの rustup(Rustの公式インストーラ)。Windowsは追加でVisual Studio Build Tools
ダウンロード Macは1GB前後。Windowsはこれに数GBが加わります
時間の目安 Macは20分。Windowsは1時間前後(ほとんどがダウンロード待ち)
環境構築の重さ Mac ★★☆ / Windows ★★★(8コースの中でいちばん重い)

こうなっていればOK

卒業まであと4章です。

この章はまだ完了していません。