システムプログラミングのための言語である 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 として、単独のページが作られているほどだ。
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円(税別) |
サイズ | |
ISBN | 978-4-87311-855-3 |
備 考 | 越谷市立図書館で借りて読む |
NDC | 007.6 |
まりんきょ学問所 > コンピュータの部屋 > コンピュータの本 > Rust > Jim Blandy, Jason Orendorff : プログラミング Rust