class Test
end
obj = Test.new
Вот несколько способов создания хэша, отличных от
class << obj
def greet
...
end
end
и (как уже упоминалось в другом ответе)
def obj.greet
...
end
# 1
obj.singleton_class.class_eval do
def greet1
'Welcome'
end
end
obj.greet1 #=> "Welcome"
# 2
obj.singleton_class.class_eval "def greet2
'Get lost'
end"
obj.greet2 #=> "Get lost"
Эта форма может быть полезна при динамическом создании одноэлементных методов.
# 3
obj.singleton_class.instance_eval do
define_method(:greet3) { 'yo' }
end
obj.greet3 #=> "yo"
# 4
obj.singleton_class.
public_send(:define_method, :greet4) { 'yo-yo' }
obj.greet4 #=> "yo-yo"
# 5
obj.define_singleton_method(:greet5) { 'yo who?' }
obj.greet5 #=> "ho who?"
# 6
module M
def greet6
'hi ya'
end
end
obj.extend M
obj.greet6 #=> "hi ya"
# 7
module M
def greet7
'hi you'
end
end
obj.singleton_class.include M
obj.greet7 #=> "hi you"
obj.methods(false)
#=> [:greet3, :greet4, :greet1, :greet2, :greet5]
obj.methods.grep /greet/
#=> [:greet3, :greet4, :greet1, :greet2, :greet5,
# :greet6, :greet7]
Практическое использование создания синглтонаМетоды очевидны для модулей (включая классы), но требуют мнения относительно других объектов.