Jim Blandy, Jason Orendorff : プログラミング Rust

作成日 : 2020-10-03
最終更新日 :

概要

システムプログラミングのための言語である Rust の解説書。

記載

Rust を WSL で動かしている。2020-10-03 で本書とは異なる個所は次の通り。

p.17 で、Cargo.toml ファイルの例があるが、 現在では [package] セクションに edition が必要である。

    [package]
    name = "iron-gcd"
    version = "0.1.0"
    authors = ["You <you@example.com>"]
    edition = "2018"
    
    # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
    
    [dependencies]
    iron = "0.5.1"
    mime = "0.2.3"
    router = "0.5.1"
    urlencoded = "0.5.0"    

[package] のセクション4行は最初から書かれている。 edition を勝手に "2020" に書き替えたら、エラーが出た。

	
$ cargo run
error: failed to parse manifest at `/mnt/c/Users/username/Documents/program/programming_rust/iron-gcd/Cargo.toml`

Caused by:
  failed to parse the `edition` key

Caused by:
  supported edition values are `2015` or `2018`, but `2020` is unknown

横文字

プログラミング言語から来る概念はたいてい横文字だ。その横文字の意味を理解するのがますます大変になった。

たとえば、8 章の表題である「クレートとモジュール」では、 クレートという概念とモジュールという概念が出てくる。 モジュールは他の言語でも、またプログラミング言語一般でも頻出する概念で、 似た機能をひとまとまりにしたもの、という程度は理解している。 しかし、クレートとは何だろうか。crate の意味を英和辞典で調べると、 (果物・びん・家具などを運ぶ)木枠・枠箱・籠などの意味が出ている。 では、クレートとモジュールとはどう違うのだろうか。 本書では、クレートそのものの定義は示されていない。その代わり、 <Rust プログラムはクレートで構成される。個々のクレートが Rust のプロジェクトを構成する。> という記載があり、クレートの機能が説明されている。一方、モジュールは本書で <モジュールは Rust の名前空間であり、Rust のプログラムやライブラリを構成する関数、 型、定数などを収めるコンテナだ。>と定義されている。

また、11 章の表題である「トレイトとジェネリクス」では、 トレイトという概念とジェネリクスという概念が出てくる。ジェネリクスは C++ などで出てきた覚えがあり、 おぼろげながら、一般性に関するある種の概念だということはわかる。では、トレイトとは何だろう。 trait の意味を英和辞典で調べると、特性・特色・特徴などの意味が出ている。 でも、いったいそれが何の概念を意味しているのだろう。そういえば Go にもトレイトが出てきていた。 いやはや、大変だ。

本書では、 <トレイト(trait)は、Rust におけるインターフェイス、もしくは抽象基底クラスのようなものだ。 ぱっと見ると、Java や C# のインターフェイスと同じに見えるだろう。> と述べられている。つまり、他の言語、たとえば Java や C# のインターフェースや、 他の言語の抽象基底クラスに相当する概念がトレイトなのだ、ということだ。ふむ。

どうでもいいこと

自由、平等、博愛

4章「所有権」のp.83 では次の Rust のコードが説明されている。

let v = vec!["liberté".to_string(),
             "égalité".to_string(),
             "fraternité".to_string()];
for mut s in v {
    s.push('|');
    println!("{}", s);
}

liberté, égalité, fraternité は、確かフランス共和国の標語で「自由、平等、博愛」ではなかったかと思う。

また、5章 「参照」のp.93 では次の文章がある。<(このような挙動は、「liberté, égalité, fraternité」の例でも見た)>

プログラミングの本なのに、一つ一つ考えないといけない単語が出てくる。

うどん、ラーメン、そば

4章「所有権」のp.83 では次の Python のコードが説明されている。

s = ['udon', 'ramen', 'soba']
t = s
u = s

liberté, égalité, fraternité に比べればこちらのほうがはるかにわかるが、日本人以外の読者にとってはどうなのだろうか。

さらに次の Rust のコードが同じ 4章の p.87で掲げられている。

use std::rc::RC;

// Rust can infer all these types; written out for clarity
let s:Rc<String> = Rc::new("shirataki".to_string());
let t:Rc<String> = s.clone();
let u:Rc<String> = s.clone();

これを受けて次の Rust のコードが同じ 4章の p.88で示されている。

assert!(s.contains("shira"));
assert_eq!(t.find("taki"), Some(5));
println!("{} are quite chewy, almost bouncy, but lack flavor", u);

しらたきがわかるのならば大したものだ。このあと、コードに noodles が出てくる。 noodles が出てくる理由が最初わからなかったが、 調べると、しらたきがダイエット食品として、パスタの代わりに使われるという記事を見た。 Wikipedia 日本版では、しらたきは単独のページではなく、こんにゃくの一部として扱われているが、 他言語の Wikipedia では、Shirataki として、単独のページが作られているほどだ。

max_by_key, min_by_key

17章「イテレータ」のp.337では、max_by_key メソッドと min_by_key メソッドが解説されている。以下引用する。 <アイテムに対してクロージャを適用した結果が最大のもの、最小のものを返す。 クロージャではアイテムのフィールドを取り出したり、アイテムに対して計算を行う。 最大値、最小値そのものにではなく、それに対応するデータに興味がある場合はよくあるので、 この関数は min や max より有用である。>私もそう思うが、これに相当するメソッドをもつ言語がどれだけあるのだろう。

誤植

p.58 下から 9 行め「面で使われいる。」とあるが、正しくは「面で使われている。」である。

p.189 中ほどの段落、上から 2 行め、「も止めるさせる方法」 とあるが、正しくは 「も止めさせる方法」 である。

p.227 下から 12 行め、「Hakell」 とあるが、正しくは 「Haskell」 である。

p.264 下から 5 行目、「の値を等価なのあれば」とあるが、ただしくは「の値と等価なのであれば」

p.301 下から 2 行め、「すべてのクロージャは固有の型のを持つ」とあるが、 正しくは「すべてのクロージャは固有の型を持つ」である。

書誌情報

書 名プログラミング Rust
著 者Jim Blandy, Jason Orendorff
訳 者中田 秀基
発行日2018 年 8 月 8 日
発行元オライリー・ジャパン
発行元オーム社
定 価4800円(税別)
サイズ
ISBN978-4-87311-855-3
備 考越谷市立図書館で借りて読む
NDC007.6

まりんきょ学問所コンピュータの部屋コンピュータの本Rust > Jim Blandy, Jason Orendorff : プログラミング Rust


MARUYAMA Satosi