『Rubyソースコード完全解説』正誤表
$Id: errata.html,v 1.47 2006/01/16 14:35:54 aamine Exp $
『Rubyソースコード完全解説』初版第一刷の時点で発見された誤りのリストです。
重要でない間違い (単純な誤字など) は最後のほうにまとめてあります。
ここに載っていない誤りを見付けたかたは
掲示板かメールで御一報ください。
筆者のメールアドレスは
<aamine@loveruby.net>
です。
序章
- p.29 (追記) ruby は OS/2 (emx 環境) や Psion、Windows CE でも動作しています。
- p.39 Visual C++ のセクション末尾「アンインストールするときはC:\ruby以下を消せばよい」
……「C:\ruby」→「C:\Program Files\ruby」
第 1 章『Ruby言語ミニマム』
- p.56 「Rubyでは変数の一文字目で」→「Rubyでは変数の先頭で」
- p.64 図1.5 ……
「重要クラス」なのにStringがないのは酷いと思う。
- p.64 図1.5 …… IO と Socket の間に BasicSocket が必要
- p.67 中程のリスト、最後の一行 ……
「B.new().test()」→「C.new().test()」
- p.74 図1.11 …… 外を検索するときはObjectは見ない (最後に検索する)。
第 2 章『オブジェクト』
- p.81 図2.3、struct RString の箱 …… char* と long の順番が逆
- p.81 図2.3、struct RArray の箱 …… 「char*」→「VALUE*」
- p.84 「仮数部」は通常は浮動小数点数で使う用語。
本文中では「符号ビットを除いた整数の表現に使う部分」
という意図で使っている。
- p.85 最終段落
「trueは真、falseは偽の代表的な値。」→
「それぞれtrueは真の、falseは偽の代表的な値。」
- p.86 RTEST() 「Qnilは下位2ビットめだけが1なので、
~Qnilは下位2ビットめだけが0」とあるが、「下位3ビットめ」が正しい。
- p.86 RTEST() 「それとbit andして真になるのはQfalseとQnilだけである」
とあるが、真ではなくて偽。より正確を期すなら「0」。
- p.87 Objectはmodule Kernelをインクルードしているため、
super には Kernel の化身クラスが入る。
- p.93 2.3.3「構造体の隙間」三段落目、struct Basic → struct RBasic
第 3 章『名前と名前表』
- p.102 「例えばキーが正の整数だと仮定できるなら」……
整数であるという仮定は必要だが、正の整数である必要はない。
- p.108 「2. 使うべきテンポラリ変数」→
「2. 見付かったエントリを代入する変数」
- p.108 「4. 検索キー」→
「4.テンポラリ変数」
- p.110 「実際に追加したら真を返す。追加しなかったら偽を返す。」
…… 返り値の真偽が逆
第 4 章『クラスとモジュール』
- p.123 間違いではないが、文章の意味が非常にとりづらい。
「だからこれを後に残してここでは残りの部分を……」は、
「本流である後半を後に残して、まずは (特殊な部分を扱う) 前半を読もう」の意味。
- p.125 第二段落「、今はobjをクラスとは限定したくない。」
→ これだと obj がクラスであることは保証されないので、
「今はobjをクラスでないと仮定しよう。」と訂正。
- p.128 中程、クラスの連鎖について
「しかし論理的にはともあれ、こんなものは効率的には実装できない」とあるが、
最新の 1.8 の実装だと「効率的には実装できない」はずの実装になっている。
つまり効率的に実装できる。
- p.128 後半
「しかしこの表現はあまりにナーバスにすぎる」→
「しかしこの表現はあまりにナイーブにすぎる」
- p.135 図4.9 右 (「コード後半」): (Object) (Module) (Class) にも継承の矢印が必要
- p.137 第一段落「実はトップレベルのクラスだけは通常の定数とは分けてrb_class_tblにまとめられているのである。」
正確には「Cで定義された、トップレベルのクラス/モジュールだけ」である。
- p.145 第一段落「p->super」→「module->super」
第 5 章『ガーベージコレクション』
- p.156 「GCの速度はO(n^2)以上のオーダーになり」→
「GCにかかる時間はO(n^2)以上のオーダーになり」
- p.161 rb_gc()リスト内のコメント
「全てのルートをマークする」→
「全てのルートからマークする」 (再帰的にマークするということ)
第 7 章『セキュリティ』
- p.195,196 危険な値に対処するのはレベル 1。
レベル 2 は「いまのところ使いみちがない」が正しい。
第 8 章『Ruby言語の詳細』
- p.202 「"\0x0f"」→「"\x0f"」 (0 が不要)
- p.212 (単項演算子型) 「+2」や「-1.0」とあるが、
数値リテラルに前置した + や - はリテラルの一部として
スキャンされます。一種の最適化のようなものです。
- p.212 (属性代入型) 「attr=(val)」→「obj.attr=(val)」
- p.213 「RubyのsuperはC++やJavaとは違い、これ一語で……」
とありますが、C++にsuperはありません。
またJavaのほうも誤解しやすい文章です。
「スーパークラスのメンバにアクセスするsuper.xのような構文はない」
というのが真意です。
- p.221 (and && or ||) and の意味が書いていない。and は or の逆で、
左辺の評価値が真であるときに右辺も評価する。
- p.230 (ブロックパラメータと多重代入) yieldした値も一つ、
ブロックパラメータも一つのときは多重代入とは言い難い。
この場合は通常の代入のように働く。
- p.231 「undefで立てた標識はあらゆる類の検索を停止させるからだ。」
…… def で再定義できる。
第 9 章『速習yacc』
- p.234 末尾
「、ということならオライリーの『yacc&lexプログラミング』をお勧めする。」
…… 書名が違いました。『lex&yaccプログラミング』です。脚注も同様。
- p.242 冒頭の表、記号「A」はすべて「S」が正しい
第 10 章『パーサ』
- 。261 冒頭の段落「もしkANDの規則がexprでなくてargにあったとすると」
……「kAND」→「kOR」
- p.269〜270 「入力が終わったときはlex_inputが0になる。」
ならない。通常のスキャンの際は lex_input が 0 になることはない。
- p.270 「CRを読み飛ばす」→「CRLFのCRを読み飛ばす」
(単独のCRは読み飛ばさない)
- p.277 「ここでは >= に対応する記号 tOP_ASGN に対して……」という記述があるが、
>= ではなく >>=。
- p.279 リストの後、「obj.m=1」の例があるが、
ここのコードとは関係ない。
- p.286 図10.10「lex」→「len」
- p.286 図10.10 バッファの最後に「\n」が必要 (lex_pendはその末尾を指す)
- p.286 図10.10の次の段落「len(読んでいない長さ)」→「len(既に読んだ長さ)」
第 11 章『状態付きスキャナ』
第 12 章『構文木の構築』
- p.330 NODE の flags のビット計算「32-(10+8)」とあるが「32-(11+8)」が正しい
- p.348 図12.7 「void_stmt」→「void_stmts」 (s がない)
- p.351 1 行目「クラス定義や特異クラス定義、特異クラス定義にもある」
…… 「特異クラス定義」が二つある。
一つはモジュール定義か特異メソッド定義か。
- p.353 1 行目「現在のローカル変数テーブル (lvtbl)」
→「現在のローカル変数テーブル (lvtbl->tbl)」
- p.358 図12.12 bbとeの間にもヘッダが必要
第 13 章『評価器の構造』
- p.363 下から二段落目
「ジッと見てまず気付くのは、
eval.cの関数からmain.cの関数を呼び返していることだ」
…… main.cではなくruby.c
- p.373 図13.2 「main」→「parent」、元のparentの箱はいらない
第 14 章『コンテキスト』
- p.401 図14.6 local_varsは変数値の配列なので「id」とあるのは全て「Qnil」
- p.401 「ne_tbl[0]」→「nd_tbl[0]」 ついでに「[0]」の書式も間違ってる
- p.412 (14.4.2 定数) 末尾の ev_const_get() の解説が完全に間違っている
(詳細は別ページに記述しました)。
- p.417 「先程がmvalue_to_svalue()、今回がsvalue_to_mvalue()だから」
とあるが、前回 (p.415末尾のリスト) はavalue_to_svalue()であった。
だから元に戻っていると想定することは難しいが、
とりあえず無視してもよいという点に変わりはない。
第 15 章『メソッド』
- p.427 の表で、NODE_SUPER が抜けている。
後述の通り、NODE_SUPER は引数あり super で
NODE_ZSUPER は引数なし super。
- p.436 『エラーメッセージには「must be enabled by ....」とあるので』
と書いてあるが、リストの中にはそういうメッセージはない。
ただし rb_enable_super() を呼べば呼べるようになるということ
自体は正しい。ちなみにこのエラーメッセージは rb_call_super()
に存在する。
第 16 章『ブロック』
- p.442 末尾、BEGIN_CALLARGSが必要なときの例が間違っている。
本には
obj.m1 { nil }.m2 { nil }
とあるのだが、正しくは
obj.m1 { yield }.m2 { nil }
でなければならない。BEGIN_CALLARGS がないと、ここで
m1 ブロック内の yield が m2 のブロックを呼び出してしまう。
このバグが発見されたのは
[ruby-dev:3067]
である。
- p.443 冒頭のリストの後
「avalue_to_yvalue()は多重代入のところでちょっと触れた」
とあるが、実際には触れていない。
もっとも、無視して構わないという点は正しい。
- p.447〜448
ruby_dyna_varsのデータ構造について
「ruby_dyna_varsは常にまっすぐな一本のリンクを形成する」
と書いてあるが、正しくない。ある時点で ruby_dyna_vars を
調査すれば確かに一本になるが、全体としてはパーサと同じような
形の枝分かれリンクを形成している。従って「一本である」ことに
関して書いた理由なども全て誤り。修正としては、該当部分を
単に削除すればいい。
- p.449 中程
「そうするとその回は下位24ビットに0が並ぶことになるので……」 →
「そうするとその回は上位24ビットに0が並ぶことになるので……」
- p.454 「Rubyレベルからruby_blockを好きに遡ることができてしまう。」
とあるが、これはやはり無理であった。つまり、
どうして全ての SCOPE を複製するのかは「よくわからない」。
この変更が加わった時期を調べて ML のログを追跡してみるしかないと思われる。
(それでも本当の理由がわかるかどうかは確実ではない)
第 19 章『スレッド』
- p.501 第二段落「読み込みが終わるまで」→
「読み込みが可能になるまで」
付録 A
- p.525 ALLOC と ALLOC_N は直接には ruby_xmalloc() を使っている
(最終的には malloc() に帰着する)。
添付 CD-ROM
cvsutils パッケージの取り違え
現時点で cvsutils というプロジェクトが二つ存在しており、
添付 CD-ROM ではこの二つのエントリとファイルがぐちゃまぜになってしまっています。
改めて読者のみなさんと両プロジェクトの開発者の方々にお侘びいたします。
可能な限り早急に修正いたします。
以下に正しいデータシートを示します。(敬称略)
cvsutils (A) 添付CD-ROMに入っているもの
cvsutils (B) 収録されていなかったもの (本来意図していたほう)
あまり重要でない間違い
- p.3 第四段落「プログラミング暦」→「プログラミング歴」
- p.5 本書の構成「第 4 部『評価器外殻』」→「第 4 部『評価器の周辺』」
- p.28 l.2 「塔載」→「搭載」
- p.30 (自動メモリ管理) 「塔載」→「搭載」
- p.35 (関数を読む) 「わかりずらい」→「わかりづらい」
- p.36 l.1 「わかりずらい」→「わかりづらい」
- p.79 2.1.2 VALUEとオブジェクト構造体「すべからく」→「常に」
- p.99 最終段落「しずらい」→「しづらい」
- p.121 末尾の段落「どう見てもこの名前はクラスを作っているうに見えるではないか。」
…… 「ように」の「よ」がない。
- p.153 5.3 「例え」→「たとえ」
- p.153 5.3.1 struct RVALUE 「すべからく」→「常に」
- p.188 末尾「ギミックが塔載されているからだ。」→
「ギミックが搭載されているからだ。」(塔載 → 搭載)
- p.191 「Pを関数ポインタとすると」→「pを関数ポインタとすると」
(大文字小文字の違い)
- p.202 「utf8」→「utf-8」
- p.215 「[0,2,4,6.8]」→「0,2,4,6,8」 (カンマがピリオドになっている)
- p.226 8.4.9 代入「すべからく」→「全て」
- p.234 l.1 「わかりずらい」→「わかりづらい」
- p.271 「一文字書き戻すpushback()」→
「バッファのポインタを一文字戻すpushback()」
(厳密に言うと「書き」戻してはいない)
- p.275 10.3.5 文字列類、文字列スキャン関数:「例え」→「たとえ」
- p.388 「例え」→「たとえ」
- p.403 末尾「早いから」→「速いから」
- p.404 「摘んでいた」→「積んでいた」
- p.416 massign(): 「例え」→「たとえ」
- p.421 第一段落「わかりずらい」→「わかりづらい」
- p.471 第二段落「理解しずらいものだ」→「理解しづらいものだ」
- p.482 第 2 段落
「これが排他ロックになってなっているわけだ。」→
「これが排他ロックになっているわけだ。」
書式指定
フォントの指定もれなど。
- p.173 「RVALUE」
- p.191 「var->getter」
- p.315 冒頭のリスト、縦三点リーダがコロンになってる
- p.401 「[0]」
- p.445 (BLOCK) コロン → 縦三点リーダ
- やっぱり「$」「{」「}」に \texttt が効いてないのがかなり気になる
- 「ruby 1.7」などでバージョン番号だけが通常書体だと目立つ
Thanks
多くの方々に誤りなどの御指摘をいただきました。
akrさん、
中田さん、
Yuyaさん、
小迫さん、
なひさん、
すぎむしさん、
Tietewさん、
なかむら(う)さん、
中村典嗣さん、
かわじさん、
高橋(征)さん、
山下さん、
秋嵩さん、
鈴木さん、
YUさん、
まつもとさん
Copyright (c) 2002-2006 Minero Aoki, All rights reserved.