blog.waterlow.work

Ruby, Rails, js, etc...

【Ruby】クラスを作るということ4

パーフェクトRubyのメタプロの部分を読んでいます。

前回のまとめ

特異クラスとは?
→あるオブジェクトに特異メソッドを付け加えたいときにそのメソッド定義が書かれるオブジェクト専用のクラス。(メソッド定義は必ずクラス定義内に書かれる必要がある。)

6-4 メソッド探索法

オブジェクトがメソッドを呼び出すときは、まず特異クラスの中を見てメソッド定義がないかどうか探す。

class BaseClass
  def hello
    :hello
  end
end

base_obj = BaseClass.new
p base_obj.hello #=> :hello

def base_obj.hello
  :singleton_object_hello
end

p base_obj.hello #=> :singleton_object_hello

またモジュールによってメソッドをincludeするときは以下の出力結果のような順番で親クラスが差し込まれる。

module HelloModule
  def hello_from_module
    :hello_from_module
  end
end

module ByeModule
end

class BaseClass
end

class MethodCall < BaseClass
  include HelloModule
  include ByeModule
end

p MethodCall.ancestors #=> [MethodCall, ByeModule, HelloModule, BaseClass, Object, Kernel, BasicObject]
#ByeModuleをラップしたクラスとHelloModuleをラップしたクラスがある。
6章のまとめ

(6-5、6-6はRuby2.0で追加されたものなのでとりあえず省略。)
1.Rubyでは(他の言語でもそうかもしれないけど)オブジェクトはひたすらメソッドを実行するのみ。
2.メソッド定義は必ずクラス定義内で行われなければならない。インスタンスメソッドはクラス定義内で定義されているけど、特異メソッドを定義すると”特異クラス”にメソッド定義がされる。
3.メソッドの検索は特異クラス→クラス→モジュール(をラップしたクラス)→親クラスの順で行われる。

いままではオブジェクトはひとつのクラス定義しか持てないと思っていたけど、じつは通常のクラスと特異クラスの2つのクラス定義から書かれている。