Один из способов сделать это - добавить анонимный модуль, который переопределяет нужный метод, печатает привет и вызывает super
, чтобы вызвать фактическую реализацию.
Я не уверен, почему вы добавляете этот метод в Class
. Ваша цель - вызвать addHelloToSingletonClassMethod
для экземпляра такого класса, как этот?
irb> s = "foo"
irb> s.addHelloToSingletonClassMethod(:upcase)
irb> s.upcase
hello
=> "FOO"
Если это так, определите следующее для Object
:
class Object
def addHelloToSingletonClassMethod(methodName)
mod = Module.new
mod.define_method(methodName) do |*args, &blk|
puts "hello"
super(*args, &blk)
end
singleton_class.prepend(mod)
end
end
Или в более типичном для Ruby соглашении об именах:
class Object
def add_hello_to_method(name)
mod = Module.new
mod.define_method(name) do |*args, &blk|
puts "hello"
super(*args, &blk)
end
singleton_class.prepend(mod)
end
end
Если ваша цель, с другой стороны, состоит в том, чтобы иметь возможность назвать его в классе следующим образом
irb> String.addHelloToSingletonClassMethod(:upcase)
irb> "foo".upcase
hello
=> "FOO"
тогда вы хотите определить его на Class
:
class Class
def add_hello_to_method(name)
mod = Module.new
mod.define_method(name) do |*args, &blk|
puts "hello"
super(*args, &blk)
end
prepend(mod)
end
end