The Ruby Way (初版)

The Ruby Way(初版)を読み始めました。

The Ruby Way―Ruby道への招待 The Ruby Way―Ruby道への招待

1.1 オブジェクト指向について

上手くまとまっているなぁと思ふ。

1.3 Rubyの中のOOP

たのしいRuby 第2版 Rubyではじめる気軽なプログラミングを読んで、もやもやしていた include/require が少し分かった気がする。

includeでは、名前空間(モジュール)の機能が現在の名前空間に追加されます。extendメソッドでは、モジュールの機能がオブジェクトに追加されます。includeでは、モジュールのメソッドをインスタンスメソッドとして利用できるようになるのに対し、extendでは、クラスメソッドとして利用できるようになります。
loadとrequireは、モジュールとはあまり関係がなく、むしろモジュール以外のRubyの(静的または動的にロード可能な)ソースとバイナリに関係があります。loadの処理は、実質的にファイルを読み込んで、それをソースファイルの現在の位置に挿入し、ファイルの定義をその位置で利用できるようにすることです。requireの処理はloadに似ていますが、ファイルが既にロードされている場合はロードしません。

特異メソッドとプロトタイプベースのオブジェクトシステム

Rubyの情報を検索していると、時々特異メソッドなるものが登場しますね。これを使用してプロトタイプベースのオブジェクト指向が実現できるとのこと。JavaScriptRhino本を読んでたときにもプロトタイプベースのオブジェクト指向が出てきて、そのときは何が何やらでしたが。

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 としても表示されませんね。スコープの問題なんだろうけど。

リフレクション

Javaで時々聞きますが、理解できてません。Smalltalkでもあるそうなので、SML勉強会で勉強できると良いな。

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