「Rubyプログラミング入門」補遺

2001.01.30変更
  1. 1刷では、p.36 の表 1.4 における push、pop、shift、unshift の説明で、配列の「先頭」と「末尾」がすっかり入れ替わっています。これは、初心者に大きな混乱を招く可能性があり、とても後悔している間違いです。(2刷で修正されています。)ちなみに、本書では先頭と末尾の定義が無いので、先頭と末尾がすっかり入れ替わっていても、それで押し通せば矛盾は起こらない(「右」と「左」のように)。無矛盾ならまあいいか、というのは一種の数学的負け惜しみです。

  2. p.222 表4.2で「これらのオプションは、Regexp("ruby", "em")のように、Regexpの第2引数として指定できます。」とありますが、これは間違いです。 正しくは第2引数には整数値(Fixnum)を指定します。指定できる整数はRegexpの定数IGNORECASE(i オプション)、EXTENDED(x オプション)、MULTILINE(m オプション)、あるいはそれらの(ビット)和で指定します。 ただし、第2引数が整数でないときは、真ならば大文字小文字を無視、偽なら大文字小文字を区別、という意味(i オプション相当)になります。(よって Regexp("ruby", "em")Regexp("ruby", true)と同値。) また、第3引数には文字コードを "n"、"e"、"s"、"u" で指定します。次の例を参考にしてください。


    なお、Rubyのversion 1.6.1 での IGNORECASEEXTENDEDMULTILINE の値は 1、2、4 です。更に 8 は旧 p オプション、16、32、16|32、64 は "n"、"e"、 "s"、"u" オプションを意味します。 従って、/ruby/ixmeRegexp.new("ruby", 1|2|4|32)と書けます。ただし数値を直接記述することは、将来の互換性を鑑みるとあまり薦められません。

    ところで、なんでこんな仕様になっているかというと、昔、正規表現のオプションは i だけだったので、true と false の区別だけで十分だったのですが、そのオプションが増えて、なるべく互換性を保とうとしながら拡張したからです。

  3. p.344 B1.1.1 で「grepsvr.rbを使えば」とありますが、CD-ROM付属のgrepsvr.rbは、Ruby Ver.1.6.1 では、Cygwin 上でうまく動きません。さしあたって、 grepsvr-1.1.3.tar.gz を使ってください。

  4. 十月に発刊という日程が動かせないのに原稿が出来る見込みが立っていない状態で、7月末に北欧に遊びに行きました。その時、編集者の森田さん(東京都在住、28才、独身)は目の前が真っ暗になったそうです。結局発刊できたわけですが、やはり色々大変でした。

  5. この本には、オブジェクト指向プログラミングにおける標準的な用語(多態性、カプセル化、など)がほとんど出てきません。これは Ruby プログラミングを通じて自然に感じられることを、頭から概念を与えてかえって阻害してしまわないように、と考えたからです。もうひとつの特徴は、「センダ」という言葉が比較的頻繁に出てくることです。この理由は、、、

  6. 第1章でオブジェクトを自動販売機に例えたのは、最初の原稿を読んだトップスタジオの金子さんが、「例えばこんな比喩はどうか、、、」と言ったのを、使わせていただいたものです。自動販売機は重くてあまり移動させたりコピーしたりする気にならないところが気に入ったのです。

  7. 「3.3.7 外部イテレータ」で「リスト」を紹介しています。普通リストはセルを繋いで作りますが、ここではセルとリストがごっちゃになっています。別にするとどう書くべきでしょう?リストの特別なものがセル?セルを拡張したものがリスト?リストの内部構造がセル?それても無関係?

  8. 「3.4.5 遅延評価」は、今年の7月、ヘルシンキに向かう飛行機の中で退屈しのぎに読んでいた『プログラムの実行と構造[上]』(エーベルソン/サスマン著、マグロウヒルISBN4-89501-293-X)の3章からパクリ、もとい、ヒントを得ています。しかし、Ruby の Procオブジェクトによる遅延評価は、Scheme のそれとは実行効率の点で比較できないので、実用的な例とはなっていません。Proc オブジェクトの利用法は、よくボタンに張り付いた機能などがあげられますが、こっちの方がかなり面白かったので書いてしまいました。なお、ヘルシンキ空港に山積みになっていた、地元紙の「郷土の有名人」のコーナーで、特大のLinusの写真が出ていました。

  9. 「4.5 MatchData」あたりで Regexp#match(string) が MatchData オブジェクトを返すことをコメントすべきでした。Ruby の Ruby らしいところだったのに。

  10. p.235 の「 /(aba*)*/ =~ "abab" 」は、選択(|)を用いないで作った、再左だが最長でないマッチングの最も簡潔な例です。

  11. 旅行中は「ブロックとProcの関係」と「マルチスレッドと遅延評価の関係」とか、「平行性と直交性の非対称性」と「内部と外部の非対称性」と「書く事と読む事の非対称性」とそれらの間の関係についてずっと考えていて、それの解答を得てから本を出そうと思っていたのですが、、、いまだに明確にできていません。

  12. 8.6.1 では、正規表現の NFA マッチングエンジンを実質20行ちょっとで実装しています。マッチングのメカニズムを言葉や図で説明するのはかなり難しいのですが、これなら一目でわかります。イテレータをブロック方向に再帰的に使うことでスタックを持たずにバックトラックを実現するという、イテレータの威力が存分に発揮されている例となっているのですが、ここまで読んでくれる人が少ないのではないかと心配しています。

  13. 最後の著者略歴で「哲学の道を行ったり来たり」と書いてあるのは、単に『哲学の道』という有名な観光地の近くに住んでいて、よく散歩したということです。

  14. 最初4人で書くはずでした。それが私一人で書くはめになったのは、他の方の遅筆のせいです。私が一番遅いと思っていました。私より遅かったのは勲章ものといえます。なお、彼らがちゃんと心を改めると来世紀早々に「続編」が出るはずです。(追加:すいません。正確には、前田さんと永井さんは遅くないです。遅いのはMとYだっ!^^;)

  15. 2刷が11月末に出ました。索引が「新・索引」に変っています。

  16. 正誤表が充実(?)してきて申し訳ないです。最近は、ちょっと表現が気に入らないといっては直しているので、正誤表としては読みにくくなってきました。


「Rubyプログラミング入門」