【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つのクラス定義から書かれている。