blog.waterlow.work

Ruby, Rails, js, etc...

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

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

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)

*** 前回のまとめ クラスオブジェクトの考え方の利点は? →Rubyにおける(他の言語もかもだけど)オブジェクト指向の動作は「インスタンスがメソッド実行する」の繰り返し。 クラス定義はClassクラスのnewメソッド。するとClassクラスのインスタンスが作られる。 そのインスタンスが「特異メソッドを定義する」というメソッドを実行するとクラスメソッドが出来上がる。 インスタンスメソッドだけは特殊。 そのクラス定義をもとに作られたインスタンスに対してメソッドを実行できるように定義しないといけないから。

*** 6-3 特異クラス 特異クラスとは? →特異メソッドが定義されたクラスのこと?

|ruby| class DataSet end

specific = DataSet.new

def specific.new_singleton_method :new_singleton_method end

p specific.singleton_class.method_defined? :new_singleton_method ||< 特異メソッドはどこに定義されてるかというと特異クラスに定義されている。 メソッドは例外なくクラス定義内に書かれていなければいけない。 それを実現しようとするもの??

以下のように定義式で書いておくこともできる。

|ruby| class Klass; end

klass = Klass.new klass.singleton_class

KLASS_OBJECT = klass puts class << klass; self; end == KLASS_OBJECT.singleton_class ||<

シングルトンオブジェクト 特異クラスの使い道としてシングルトンオブジェクトがあります。

|ruby| SINGLETON_OBJECT = Object.new

class << SINGLETON_OBJECT def only_method :only_method end end

p SINGLETON_OBJECT.only_method <|| と言っても定数にObjectクラスのインスタンスを入れておいてその特異クラスにどんどんメソッドを定義していくだけですが… このサンプルを読んだだけではあまりピンと来なかったので特異クラスの理解は今後の課題ですね。