特異メソッドの定義方法(おまけで特異メソッドの定義方法)

http://d.hatena.ne.jp/toshi_hirasawa/20080808/1360124848
の部分と関係しております

こちら様からのコピペでございます(ありがとうございます)
http://cyakarin.kuronowish.com/index.cgi?cla_ano

このように特異クラスを開くことで、
その中に記述されるメソッドは全て特異メソッドとして定義されます。
特定のオブジェクトに対して、複数の特異メソッドを定義したい場合に特異クラスを用いるとよいでしょう。

ちなみに、全てのクラスは「Class クラス」のオブジェクトであるため、
クラスメソッドはそのクラスにのみ定義される特異メソッドと言えます。
なのでクラスメソッドも特異クラスのように記述することが可能です。
しかし習慣的にクラスメソッドは一つずつ定義される傾向にあるように思えます。

こちらが、まとめのお言葉でございます。ありがとうございます orz

[hirasawa@centos-hira ~]$ cat tokuiClass.rb
#!/usr/local/bin/ruby -Ku
class Coffee
   def initialize(hotness, size)
     @taste = "Black"
     @hotness = hotness
     @size = size
   end
   attr_reader :taste, :hotness, :size
end

general_coffee = Coffee.new("Hot", "Grande")
custom_coffee = Coffee.new("Hot", "Tall")

class << custom_coffee
   def special_topping
     @special_topping = "Honey"
   end
end

puts custom_coffee.special_topping
#puts general_coffee.special_topping  #error!
# ./tokuiClass.rb:21:in `<main>': undefined method `special_topping'
# for #<Coffee:0xa045b00> (NoMethodError)
[hirasawa@centos-hira ~]$ ./tokuiClass.rb
Honey
[hirasawa@centos-hira ~]$

特異メソッドを複数以上定義したい場合には、特異クラスのほうが有利
ってことですな なるほど

[hirasawa@centos-hira ~]$ cat tokuiClass2.rb
#!/usr/local/bin/ruby -Ku
class Coffee
   def initialize(hotness, size)
     @taste = "Black"
     @hotness = hotness
     @size = size
   end
   attr_reader :taste, :hotness, :size
end

general_coffee = Coffee.new("Hot", "Grande")
custom_coffee = Coffee.new("Hot", "Tall")

class << custom_coffee
   def honey_topping
     @honey_topping = "Honey"
   end
   def milk_topping
     @milk_topping = "Milk"
   end
end

puts custom_coffee.honey_topping
puts custom_coffee.milk_topping
[hirasawa@centos-hira ~]$ ./tokuiMethod2.rb
Honey
Milk
[hirasawa@centos-hira ~]$

以下は特異メソッド定義への書き直しバージョン
(1つだけメソッドを定義したい場合などにより有効)

[hirasawa@centos-hira ~]$ cat tokuiMethod.rb
#!/usr/local/bin/ruby -Ku
class Coffee
   def initialize(hotness, size)
     @taste = "Black"
     @hotness = hotness
     @size = size
   end
   attr_reader :taste, :hotness, :size
end

general_coffee = Coffee.new("Hot", "Grande")
custom_coffee = Coffee.new("Hot", "Tall")

#class << custom_coffee
#   def special_topping
#     @special_topping = Honey
#   end
#end
   def custom_coffee.special_topping
     @special_topping = "Honey"
   end

puts custom_coffee.special_topping
[hirasawa@centos-hira ~]$ ./tokuiMethod.rb
Honey
[hirasawa@centos-hira ~]$