人気ブログランキング | 話題のタグを見る

特異メソッドと特異クラス

Rubyではインスタンスにそのインスタンスだけのメソッドを定義できる。これを特異メソッドという。次の例では、Employee クラスの二つのインスタンス foo と bar を作っているが、foo のメソッドは特異メソッドでオーバーライドしている。

~$ irb --simple-prompt --noinspect
>> class Employee
>>   def bonus
>>     500
>>   end
>> end
=> 
>> foo = Employee.new
=> #<Employee:0xb7c6a360>
>> bar = Employee.new
=> #<Employee:0xb7c66f6c>
>> foo.bonus
=> 500
>> bar.bonus
=> 500
>> def foo.bonus
>>   1000
>> end
=> 
>> foo.bonus
=> 1000
>> bar.bonus
=> 500

インスタンスに後からメソッドを定義できるので便利な方法だが、次の方法を使うとインスタンス変数などのクラスで定義するのと同じ機能をインスタンスに与えることができる。

次の例では、foo インスタンスに新たに @name というインスタンス変数と say というメソッドを付け加える。まるで、foo だけに新しい無名のクラスを与えたかのようだ。これを特異クラスという。

>> class << foo
>>   attr_accessor :name
>>   def say
>>     puts "Hello, #{@name}."
>>   end
>> end
=> 
>> foo.name = "Dolly"
=> Dolly
>> foo.say
Hello, Dolly.

また、次のようにインスタンスに self を指定すると、クラスメソッドを簡潔に定義できる。よくわからないのだが、クラスもオブジェクトなのでこういうことができるらしい。それにしても、誰がこんなことを考えつくのだろう。

>> class Foo
>>   class << self
>>     def hi
>>       puts "Hi"
>>     end
>> 
?>     def bye
>>       puts "Good-bye"
>>     end
>>   end
>> end
=> 
>> Foo.hi
Hi
=> 
>> Foo.bye
Good-bye
by tnomura9 | 2008-10-16 06:46 | Ruby | Comments(0)
<< RoR config/boot.rb RoR レイアウトの yiel... >>