下記のような記述にて「class << TestClassまたはself」で書いたクラス定義を特異クラス定義といいます。そしてそこで定義されたメソッドを特異メソッドといいます。下記の場合で特異メソッドは、「say_a,b,c」となります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class TestClass class << TestClass def say_a puts "a" end end class << self def say_b puts "b" end end end class << TestClass def say_c puts "c" end end TestClass.say_a TestClass.say_b TestClass.say_c |
a b c
Contents
特異メソッド
特異クラス定義
特異メソッドは任意のオブジェクト(インスタンス)にメソッドを追加することができます。上記「singleton_class.rb」の場合は一見「TestClass」というクラスにメソッドを追加しているように見えますが、実際は「Class」クラスのオブジェクトとして「TestClass」があり、その「TestClass」オブジェクトに対してのインスタンスメソッドが定義されて、結果的に特異メソッドとなります。
1 |
p TestClass.class |
Class
上記の実行結果をみても「TestClass」クラスが「Class」クラスのオブジェクトであることが良くわかりますね。
特定のインスタンスに定義
また下記のように特定のオブジェクト(インスタンス)にメソッドを定義(追加)することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
class TestClass # 先程の「say_a,b,c」は省略 end test = TestClass.new def test.say_d puts "d" end class << test def say_e puts "e" end end test.say_d test.say_e |
d e
コメントを残す