【Ruby】クラスを作るということ3
パーフェクトRubyのメタプロの部分を読んでいます。
- 作者: Rubyサポーターズ,すがわらまさのり,寺田玄太郎,三村益隆,近藤宇智朗,橋立友宏,関口亮一
- 出版社/メーカー: 技術評論社
- 発売日: 2013/08/10
- メディア: 大型本
- この商品を含むブログ (22件) を見る
*** 前回のまとめ クラスオブジェクトの考え方の利点は? →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クラスのインスタンスを入れておいてその特異クラスにどんどんメソッドを定義していくだけですが… このサンプルを読んだだけではあまりピンと来なかったので特異クラスの理解は今後の課題ですね。