一昨日になってようやく入手できた
プログラミング言語Ruby[rakuten]を、Ruby 1.9.1RC2とそのNEWSファイルを手元に置きながら読んだ。
少々乱暴な言い方になるかもしれないが、この本は以下のような人には用のないものだと思う。
- Ruby 1.9.xもRuby 1.8.xも十分に理解できている
- Ruby 1.9.xをしばらくは使うつもりがなく、自分が使う範囲においてRuby 1.8.xに不明なところはない
- Rubyの経験がなく、その他のオブジェクト指向言語の経験および知識もない
- プログラミング経験がなく、これからプログラミングの学習を始める
この本はRubyそのもののかなり詳しい解説書である。入門書ではない。一応は簡単なところから入る形になっているのだが、大部分はすでにRubyを使っていて、ちょっとしたことなら困らない程度の知識があることを前提としている。つまり、Rubyをより深く知るための解説がある。プログラミング自体の入門者は別の本(おそらく初めてのRuby[rakuten]やたのしいRuby[rakuten]など)が適切だろう。プログラミングの経験はあるが、Rubyやその他のオブジェクト指向言語に馴染みがないという人は、チュートリアルなどをこなしてからにしたほうがよさそうだ(これに当たる人には「用のない」とまでは言えない)。
全体的にはRuby 1.8系をベースにしていると思われるが、Ruby 1.9.1での状況についてもそれなりのスペースを当てている。私は1.9.1での新しい機能や1.8系との非互換に特に注目して読み進めたのだが、たとえば多言語化関係のような大きなトピックにはそれなりのスペースがあてられている。込み入ったところではどうかは分からないが、多言語化の仕様・実装の推移をほとんど追いかけていなかった(追いかけられなかった)私でも、その基本的な使い方や注意点がわかるのに十分な記述はある。細いところでも、メソッドの追加や削除についての補足があり、場合によっては新しい機能(たとえば->(){}やノンブロッキングIOなど)の詳しい使い方が示されてもいる。
参考までにRuby 1.9.1RC2のNEWSファイルとの対応状況をごく簡単にまとめてみたところ、少なくとも六割くらいはカバーされていることが分かった。NEWSファイルの記述は粒度がまちまちだということもあって、実のところ、読んでみた印象よりもこれは低い数値だった。とはいえ、前述した通り大きなトピックについては十分にカバーされている。
Ruby 1.8系から変化のない部分についても(もちろん)詳しい説明がある。思いもよらぬ機能や動作があることをこの本によって知ることができた。たとえばこんなことである。
f(3+2)+1とf (3+2)+1の違いp {1=>2}とp 1=>2で正しいのは?to_sとto_strの違いinitialize_copyの機能とdup、cloneandと&&の使い分け方ensure節の中でreturnすると例外が消える- Ruby 1.9.1の
Range#include?の遅さ - Ruby 1.9.1のスレッド実装では複数スレッドが同時に実行されることはない
これらは、このような細いところまで説明しているという単なる例だ。一方で、HashやNumericなどと馴染むような標準的なクラスの作り方(7.1節)に十分なページ(20ページ)があてられてもいる。そうかと思えば「関数プログラミング」と題して10ページほどの解説を展開したりする(6.8節)。
そのようなわけで、Ruby 1.9.1をこれから始めようというのならおすすめだし、Ruby 1.9.1を使わないにしてもRuby 1.8.xで不明な点があるなら(そして他の書籍などが手元にないなら)やはりおすすめできる。結局のところ、多くのRubyユーザにとって読んでみて損のない本だと思う。ただし、何かの作業のための実用的な(というのは外部コマンドを起動したり、特定の形式のデータ処理をするような、実務的な)プログラミングのためのヒントは限られたものしかないため、そのような意味での情報を求めている人は別の書籍なりなんなりと比較してみたほうが良いだろう。
最後に理解できなかったところや記述間違いと思われるところなどを挙げておく。
- 62ページ「
setbyote」→「setbyte」 - 82ページ、129ページ「
:s === "s" # Ruby 1.9ではtrue」実際にはfalse - 164ページ「
$ERROR_INRO」→「$ERROR_INFO」 - 169ページ「利害」は「例外」の間違い?
- 193ページ「しかし、rest引数より前に置かなければならい」のは何であるかよくわからない
- 257ページ「
require 'Singleton'」→「require 'singleton'」 - 286ページ「
define_methodには、ブロックを前提とするメソッド本体を指定できないという欠点がある」とあるが、1.9.1ではできるようになった(→151ページ) - 305ページ、307ページ「定義されたメソッドがブロックを受け付けられるようにしたいので、
define_methodを使うことできない」→上と同じ - 358ページ「
[1, [2, [3]]].flatten(1) #=> [1,2,[3]]: レベル指定: Ruby 1.9」とあるがRuby 1.8.7でも可能
Ruby 1.9.1の新機能(青、橙)、変更されたところ(緑)、非互換(赤、桃)、メモ(黄)というようにPois-itを貼りながら読んでいったところ、下の写真のようになった。Ruby 1.9.1目当てだったとしてもこのくらいは楽しめる。
