コンセプトから理解するRust

サポートページ

この記事を読むのに必要な時間:およそ 0.5 分

お詫びと訂正(正誤表)

本書の以下の部分に誤りがありました。ここに訂正するとともに,ご迷惑をおかけしたことを深くお詫び申し上げます。

(2025年4月23日最終更新)

P.57 上から1行目

Pythonの場合は、変数に対応する値の型によってイミュータブルかミュータブルかが決められており、=で結び付けたときの挙動は、値がイミュータブルかミュータブルかによって変わります。整数型の値はイミュータブルであり、イミュータブルな値については、=で結び付けたときの挙動はC言語と同じように考えることができます。
Pythonの場合は、変数に対応するオブジェクトの型によってイミュータブルかミュータブルかが決められており、=で結び付けたときの挙動は、オブジェクトがイミュータブルかミュータブルかによって変わります。整数型のオブジェクトはイミュータブルであり、イミュータブルなオブジェクトについては、=で結び付けたときの挙動は次のように確認することができます。

P.57 下から5行目

xに1を加算してもyは影響を受けない
y = xによって、変数xと変数yは同じIDのオブジェクトを指している

P.57 下から4行目

変数xと変数yは異なるIDのオブジェクトを指している
x = x + 1によって、変数xのオブジェクトのIDは変化する。一方、変数yのオブジェクトのIDは変化しない

P.57 下から3行目

すなわち、xやyというラベルが貼られた値は異なるメモリ領域に確保されており、xに何らかの操作をしてもxというラベルが貼られたメモリ領域の値が変わるだけで、yというラベルが貼られたメモリ領域の値はなんら影響を受けません
すなわち、x、yのラベルが貼られているイミュータブルなオブジェクトに対して、x = x + 1の操作をした場合、その計算結果を格納するオブジェクトが新規に作成され、その新しいオブジェクトのラベルがxになります。このとき、yというラベルが貼ら オブジェクトはなんら影響を受けません

P.57 脚注3

イミュータブルな変数に対して何らかの演算を行うと、その演算結果を格納するための別のメモリ領域が確保され、そのメモリ領域に演算結果が書き込まれ、xというラベルは新たに確保されたメモリ領域の値に付け替えられます。そして、元のメモリ領域に置かれた値にはラベルが付与されていない状態になり、ガベージコレクションによって解放されます。
イミュータブルなオブジェクトは変更できないためです。

P.58 図3.8

中央の図の内容に誤りがありました。以下が正しい図です。

rust_image_p57_old.png
zu3-8_new.png

P.58 図3.8キャプション

Pythonにおける整数型の場合の変数とメモリ(オブジェクト)の関係
Pythonにおける整数型の場合の変数とオブジェクトの関係

P.59 上から2行目

 なぜこのようになってしまうかというと、y = xという操作が、yのために新しいメモリ領域を確保しているのではなく、xというラベルが指し示していた値にyというラベルを追加したことに対応しているからです。つまり、ラベルはxとyと異なっているものの、実体は同じものを指しているため、xに対して実行した操作がyに対しても実行されてしまっているわけです
y = xによって、xとyが同じオブジェクトを参照するようになる点は、イミュータブルなオブジェクトの場合と同様です。しかし、xを通じてそのオブジェクトに変更を加えようとした場合、イミュータブルの場合とは異なり新しいオブジェクトは作成されず、既存のオブジェクト自体が変更されます。xとyは異なるラベルを持っていても、どちらも同じオブジェクトを参照しているため、xによる操作の結果がyにも影響しているように見えるのです

P.59 図3.9キャプション

Pythonにおけるリスト型の場合の変数とメモリ(オブジェクト)の関係
Pythonにおけるリスト型の場合の変数とオブジェクトの関係

P.59 図3.9

zu3-9_old.png
zu3-9_new.png

(以下2024年10月28日更新)

P.183 図4.12 「カウンタ:3」部分

child: Node
child: None

(以下2024年5月30日更新)

P.320 リスト8.7

最後の行に以下が必要でした。

print_sum_hello(10000000)

(以下2024年4月1日更新)

P.190 図4.13中のテキスト(2ヵ所)

chaild
child

P.191 図4.14中のテキスト(2ヵ所)

chaild
child

P.193 図4.15中のテキスト(2ヵ所)

chaild
child

P.190 図4.16中のテキスト(2ヵ所)

chaild
child

P.214 下から8行目

また、EqおよびOrdは比較が必ずできる(失敗しない)型に対して、PartialEqおよびPartialOrdは比較ができない場合がある型に対して実装します。i32型などの整数型には、前者の"Partial"なしのトレイトが実装されているのに対し、f64、f32などの浮動小数点型には後者の"Partial" 付きのトレイトが実装されています。浮動小数点型の場合にはNaN(Not A Number)との比較ができないため、"Partial"付きになっています。
また、同じ型の同じ値同士の等値比較において、EqやOrdはいつでも真となることを前提にできる型に実装できるのに対し、PartialEqおよびPartialOrdはそれを前提にできる型に加え、できない型にも実装できます(数学的な言葉でいえば、PartialEqやPartialOrdは「その型に属する値が反射律を満たすことを要求されない型」に対して実装できるものです)。EqやOrdが実装される型には、自動的にPartialEqやPartialOrdも実装されています(EqやOrdがPartialEqやPartialOrdのサブトレイト(p216参照)であるため)。たとえば、浮動小数点型f32、f64はNaN(Not A Number)という値を含んでいますが、NaN == NaNの等値比較の結果は偽となるため、これらの型には"Partial"付きのトレイトのみが実装されています。一方、i32型などの整数型には、"Partial"なし、および"Partial"付きの両方のトレイトが実装されています。

(以下2023年1月11日更新)

P.192 下から4行目

Rc::clone()
Rc::new()

(以下2022年12月26日更新)

P.23 3行目

std::fmt::Displayいうトレイト
std::fmt::Displayいうトレイト

P.71 3つ目のコード囲み10行目

myclear(&s);
myclear(s_ref);

P.142 リスト4.14のキャプション

Result<T,E>}
Result<T,E>

余計な「}」がありました。

P.154 Pythonのコード 10行目

print("The capital of {} is {}.".format(
print("The capital of {} is {}".format(

余計な「.」がありました。

P.154 Pythonのコード 14行目

print(The capital of {} is not found.".format(tg))
print("The capital of {} is not found".format(tg))

「"」が抜けており,余計な「.」がありました。

P.151 本文5行目

Some(“medium) を返却
Some(“large") を返却

P.154 Pythonのコード 11行目

tf, capitals["Japan"]
tg, capitals[tg]

P.171 リスト4.19 29行目

"to b3 12, 12: {}, {}",
"to be 12, 12: {}, {}",

P.171 エラー画面 1行目

rror[E0597]:
error[E0597]:

「e」が抜けていました。

P.174 エラー画面 2行目

to b3 12, 12: 12, 12
to be 12, 12: 12, 12

P.180 リスト4.22 31行目

"to b3 12, 12: {}, {}",
"to be 12, 12: {}, {}",

P.184 本文7行目

変換するのもので
変換するもので

「の」が不要です。

P.213 本文14行目

+演算子を使って表示
+演算子を使って表現

P.218 リスト5.11 32,41行目

// distance_eqの大小を、
// distance_sqの大小を、

(以下2022年12月1日更新)

P.17 端末画面

$ cargp clippy # clippyを実行
$ cargo clippy # clippyを実行

(以下2022年11月24日更新)

P.154 Pythonのコード 2行目

capticals["Japan"] = "Tokyo"
capitals["Japan"] = "Tokyo"

(以下2022年9月15日更新)

P.34 1行目

クレート名(json_serde)に変えるだけです。
クレート名(serde_json)に変えるだけです。

(以下2022年7月19日更新)

P.171 リスト 4.19の10行目

let number = Box::new(value + 10);
let number = value + 10;

(以下2022年6月1日更新)

P.245 本文9行目

実はこれは20行目と同じ意味になります。
実はこれは21行目と同じ意味になります。

(以下2022年3月30日更新)

P.289 3行目の漸化式

誤
正

最初のSの下付きは「N-1」ではなく「-1」であるべきでした。