The Ruby Way (初版)
The Ruby Way(初版)を読み始めました。
1.1 オブジェクト指向について
上手くまとまっているなぁと思ふ。
1.3 Rubyの中のOOP
たのしいRuby 第2版 Rubyではじめる気軽なプログラミングを読んで、もやもやしていた include/require が少し分かった気がする。
includeでは、名前空間(モジュール)の機能が現在の名前空間に追加されます。extendメソッドでは、モジュールの機能がオブジェクトに追加されます。includeでは、モジュールのメソッドをインスタンスメソッドとして利用できるようになるのに対し、extendでは、クラスメソッドとして利用できるようになります。
loadとrequireは、モジュールとはあまり関係がなく、むしろモジュール以外のRubyの(静的または動的にロード可能な)ソースとバイナリに関係があります。loadの処理は、実質的にファイルを読み込んで、それをソースファイルの現在の位置に挿入し、ファイルの定義をその位置で利用できるようにすることです。requireの処理はloadに似ていますが、ファイルが既にロードされている場合はロードしません。
特異メソッドとプロトタイプベースのオブジェクトシステム
Rubyの情報を検索していると、時々特異メソッドなるものが登場しますね。これを使用してプロトタイプベースのオブジェクト指向が実現できるとのこと。JavaScriptのRhino本を読んでたときにもプロトタイプベースのオブジェクト指向が出てきて、そのときは何が何やらでしたが。
1.4 Rubyの動的な側面
evalなんてのがあるのですね。
#! ruby -Ks loop { print "> " STDOUT.flush s = gets.strip break if s.empty? begin eval(s) rescue =>e puts e end }
a = 10; puts a なら10と出ますが、a=10として次のevalでputs a としても表示されませんね。スコープの問題なんだろうけど。
1.5 直感を鍛える:覚えておくべき事柄
and-or 演算子と &&-||演算子の優先順位の関係で語られている次のコード。
a1がfalseと表示されるのでちょっと焦る。ただしコメントのようにすればtrueと表示されるわけで、論理演算子の優先度によるものではなく、or演算子と代入演算子の優先度の関係でfalseと表示されるのであって、誤解を招くと思うな。
もちろん優先度が異なり、その結果として、代入演算子との評価順序が異なるわけで、直後の例で示されてるわけですが、順番に読むと?となる。
#! ruby -Ks a = true b = false c = true d = true #a1 = (a && b or c && d) a1 = a && b or c && d a2 = a && (b or c) && d p a1 p a2