Ruby 3 オブジェクト指向とはじめての設計 (CD-ROM付) (プログラミング学習シリーズ) 』(arton 、宇野るいも 著)

は初心者にとってもよい本なんで、シリーズ1巻目から地道に勉強中です。


ところで、第1章〜第3章で、つまずいた所、誤植?と思った所のメモです。

(2012.5.27 追記;
早々に、公式ページの正誤表(最終更新日:2012-05-25)が更新され、
以下の記述はほぼ不要となってます。


○前提;
・書籍は初版第1刷

公式ページの正誤表(最終更新日:2010-05-28)で直しておきます。 

・Ruby 1.9.2  以降を使う場合は、自作ライブラリをカレントディレクトリに置いた場合、
require "bar" だと、ロードエラーになります(カレントディレクトリはロードしないため)。
require_relative "bar" と変えれば、 ロードされます。

(詳しくは、以前の記事を参照;
Ruby 2 さまざまなデータとアルゴリズム』、『Ruby 3 オブジェクト指向とはじめての設計』(arton 、宇野るいも 著)で、require の LoadError が出たときの対処法 )



○第1章
・p.12 下から2行目;
(誤)attr_writerメソッド
(正)attr_readerメソッド

・p.13 上から2行目;
(誤)attr_readerメソッド
(正)attr_writerメソッド

・p.23 下から3行目;
(誤)win?メソッド 
(正)judgeメソッド

・p.23 下から2行目;
(誤)win?メソッド
(正)judgeメソッド

・p.27 下から9行目;
(誤)6行分
(正)7行分


○第3章
・p.75 リスト3-2 stage01/not_test.rb
(注)上述のように、Ruby 1.9.2  以降を使う場合は、
require "bar" を require_relative "bar"  に修正しないとロードエラーになる。
これ以降のリストもすべて同様。

 
・p.95 上から3行目
 puts "t2 = #{t2.state}"

(注)今まではずっと
 puts("t2 = #{t2.state}") 
 のように、putsはカッコ付きで呼び出していたが、ここでいきなり説明もなくカッコ省略で使われている。
 もちろん、間違いではないが、この本のこれまでの丁寧な解説からだと、一言説明があってもよさそうなところ。さらに、本の後の方ではまた、puts() という書き方に戻っている。(2人の著者の書き方の差か?)

・p.106 リスト3-29 stage05/and.rb
(誤)(以下、stage04/and.rbと同じ)
   条件文 if t.state == 0
(正)条件文 if t.state != 1
 ※ これは、and.rb 単独だと誤りではないが、p.112 リスト3-35 stage05/three-bit-adder.rb に使われると、不具合が出る。(後述)
 ※なお、付録CD-ROM では、(正)のように訂正されている。
 ※ところが、公式ページの正誤表には;
”付属CD-ROMに収録されているstage05/and.rbは、修正されています。
なお、stage05/and.rbの12行目は、stage04/and.rbの12行目と同様に、
        if t.state == 0
としても動作します。”

と記載されてしまっている。


・p.112 リスト3-35 stage05/three-bit-adder.rb
(正)def initialize(name)中に以下の一行を追加
 full_adder[0].get_input_terminal(2).state = 0

 ※これが無いと、全加算器0(full_adder[0])のキャリー入力(input_terminal(2)) = 0  が設定されず、nill のままになってしまう。
それでは、先ほどのp.106 リスト3-29 stage05/and.rb で
条件文 if t.state == 0 (書籍)と条件文 if t.state != 1 (CD-ROM)では nil に対する判定が異なるので結果が異なってしまう。
(CD-ROM の if t.state != 1 の方が正しい結果になる。) 
なお、付属 CD-ROM だとp.106 リスト3-29 stage05/and.rb は if t.state != 1 に修正されているので、一行追加しなくても、結果的には正しい出力をするが、この一行は追加した方がいいと思う。


p.113 リスト3-36 stage05/three_bit_adder_test.rb
リスト3行目;three_bit_adder = ThreeBitAdder.new('ThreeBitAdder')
(注)急に引数の指定にシングルクォーテーション(')を使っている。今まではずっとダブルクォーテーション(")だったので、違和感。説明も無いし、なんでここだけそうなっているのか考えてしまった。

p. 116 練習問題 3.1
(注)変数名にnot、or、and とはつけられない。(Ruby の予約語のため)
これで、ハマった。
予約語の説明や変数名に使えないもののリストとか本文では無かったような。
 
p.117 リスト3-37 stage05/test.rb
リスト下から2行目; t = ThreeBitAdder.new('ThreeBitAdder')
(注)引数の指定にシングルクォーテーション(')を使っているのは、上述の p.113リスト3-36 stage05/three_bit_adder_test.rb とここだけだと思う。

p.117 実行結果
(誤)こうはならない
(正)
[0, 0, 0, 0, 0, 0] => [0, 0, 0, 0]
[1, 0, 0, 0, 0, 0] => [0, 1, 0, 0]
[0, 1, 0, 0, 0, 0] => [0, 1, 0, 0]
[1, 1, 0, 0, 0, 0] => [1, 0, 0, 0]
[0, 0, 1, 0, 0, 0] => [0, 0, 1, 0]
[1, 0, 1, 0, 0, 0] => [0, 1, 1, 0]
[0, 1, 1, 0, 0, 0] => [0, 1, 1, 0]
[1, 1, 1, 0, 0, 0] => [1, 0, 1, 0]
[0, 0, 0, 1, 0, 0] => [0, 0, 1, 0]
[1, 0, 0, 1, 0, 0] => [0, 1, 1, 0]
[0, 1, 0, 1, 0, 0] => [0, 1, 1, 0]
[1, 1, 0, 1, 0, 0] => [1, 0, 1, 0]
[0, 0, 1, 1, 0, 0] => [0, 1, 0, 0]
[1, 0, 1, 1, 0, 0] => [1, 0, 0, 0]
[0, 1, 1, 1, 0, 0] => [1, 0, 0, 0]
[1, 1, 1, 1, 0, 0] => [1, 1, 0, 0]
[0, 0, 0, 0, 1, 0] => [0, 0, 0, 1]
[1, 0, 0, 0, 1, 0] => [0, 1, 0, 1]
[0, 1, 0, 0, 1, 0] => [0, 1, 0, 1]
[1, 1, 0, 0, 1, 0] => [1, 0, 0, 1]
[0, 0, 1, 0, 1, 0] => [0, 0, 1, 1]
[1, 0, 1, 0, 1, 0] => [0, 1, 1, 1]
[0, 1, 1, 0, 1, 0] => [0, 1, 1, 1]
[1, 1, 1, 0, 1, 0] => [1, 0, 1, 1]
[0, 0, 0, 1, 1, 0] => [0, 0, 1, 1]
[1, 0, 0, 1, 1, 0] => [0, 1, 1, 1]
[0, 1, 0, 1, 1, 0] => [0, 1, 1, 1]
[1, 1, 0, 1, 1, 0] => [1, 0, 1, 1]
[0, 0, 1, 1, 1, 0] => [0, 1, 0, 1]
[1, 0, 1, 1, 1, 0] => [1, 0, 0, 1]
[0, 1, 1, 1, 1, 0] => [1, 0, 0, 1]
[1, 1, 1, 1, 1, 0] => [1, 1, 0, 1]
[0, 0, 0, 0, 0, 1] => [0, 0, 0, 1]
[1, 0, 0, 0, 0, 1] => [0, 1, 0, 1]
[0, 1, 0, 0, 0, 1] => [0, 1, 0, 1]
[1, 1, 0, 0, 0, 1] => [1, 0, 0, 1]
[0, 0, 1, 0, 0, 1] => [0, 0, 1, 1]
[1, 0, 1, 0, 0, 1] => [0, 1, 1, 1]
[0, 1, 1, 0, 0, 1] => [0, 1, 1, 1]
[1, 1, 1, 0, 0, 1] => [1, 0, 1, 1]
[0, 0, 0, 1, 0, 1] => [0, 0, 1, 1]
[1, 0, 0, 1, 0, 1] => [0, 1, 1, 1]
[0, 1, 0, 1, 0, 1] => [0, 1, 1, 1]
[1, 1, 0, 1, 0, 1] => [1, 0, 1, 1]
[0, 0, 1, 1, 0, 1] => [0, 1, 0, 1]
[1, 0, 1, 1, 0, 1] => [1, 0, 0, 1]
[0, 1, 1, 1, 0, 1] => [1, 0, 0, 1]
[1, 1, 1, 1, 0, 1] => [1, 1, 0, 1]
[0, 0, 0, 0, 1, 1] => [0, 0, 1, 0]
[1, 0, 0, 0, 1, 1] => [0, 1, 1, 0]
[0, 1, 0, 0, 1, 1] => [0, 1, 1, 0]
[1, 1, 0, 0, 1, 1] => [1, 0, 1, 0]
[0, 0, 1, 0, 1, 1] => [0, 1, 0, 0]
[1, 0, 1, 0, 1, 1] => [1, 0, 0, 0]
[0, 1, 1, 0, 1, 1] => [1, 0, 0, 0]
[1, 1, 1, 0, 1, 1] => [1, 1, 0, 0]
[0, 0, 0, 1, 1, 1] => [0, 1, 0, 0]
[1, 0, 0, 1, 1, 1] => [1, 0, 0, 0]
[0, 1, 0, 1, 1, 1] => [1, 0, 0, 0]
[1, 1, 0, 1, 1, 1] => [1, 1, 0, 0]
[0, 0, 1, 1, 1, 1] => [0, 1, 1, 0]
[1, 0, 1, 1, 1, 1] => [1, 0, 1, 0]
[0, 1, 1, 1, 1, 1] => [1, 0, 1, 0]
[1, 1, 1, 1, 1, 1] => [1, 1, 1, 0]

・p.266 (2) stage02/and.rb
リスト1行目の次に一行追加;require "logic-device"

・p.266 (2) stage02/xor.rb
リスト1行目の次に一行追加;require "logic-device"

・p.266 (3) stage04/and.rb
リスト1行目の次に一行追加;require "logic-device"

リスト8行目;
(誤)if t.state == 0
(正)if t.state != 1
 ※ここだけでは誤りではないが、上述の p.106 リスト3-29 stage05/and.rb の問題が起こるので、(正)の方がよい。それに、他のstage のand.rb も皆、(正)のように記述してる。

・p.267 (3) stage04/xor.rb
リスト1行目の次に一行追加;require "logic-device"

・p.267 練習問題 xor.rb
リスト11行目;
(誤)o = Or.new(name + ".Xor(0)", 2)
(正)o = Or.new(name + ".Or(0)", 2)


以上、よかったら参考にしてください。



Ruby 3 オブジェクト指向とはじめての設計 (CD-ROM付) (プログラミング学習シリーズ)Ruby 3 オブジェクト指向とはじめての設計 (CD-ROM付) (プログラミング学習シリーズ)
著者:arton
販売元:翔泳社
(2009-08-28)
販売元:Amazon.co.jp
クチコミを見る