Измените bound_method
на:
def bound_method name
self.class.instance_variable_get(:@hidden_mthod)[name].bind(self)
end
Это переменная экземпляра, а не класс.
РЕДАКТИРОВАТЬ В соответствии с вашим комментарием я не решил вашу проблему. Поэтому мне пришлось стереть много древних рубиновых знаний. Я нашел эту тему .
А потом я изменил ваш метод дальше:
def bound_method name
puts self.class.instance_variable_get(:@hidden_mthod)[name]
metaclass = class << self; self; end
metaclass.send(:define_method, name,
self.class.instance_variable_get(:@hidden_mthod)[name])
end
В основном bind
позволит вам вызывать этот метод для экземпляра один раз, например:
self.class.instance_variable_get(:@hidden_mthod)[name].bind(self).call()
Но не добавляет метод к экземпляру. :define_method
делает. Надеюсь, это поможет вам.