В комментарии к вопросу ОП пояснил, что все созданные методы будут выполнять одни и те же операции и возвращать одинаковые значения.Это означает, что все методы экземпляра, созданные после первого, можно просто сделать псевдонимами исходного метода экземпляра.(Непонятно, почему это было бы полезно, но это не относится к делу.) В модуле Foo
я назвал этот оригинальный мгновенный метод boilerplate
.Мы могли бы написать следующее:
module Foo
def detect(method_name)
self.class.send(:alias_method, method_name, :boilerplate)
end
def boilerplate
yield "Spud"
end
end
class Bar
include Foo
end
См. Модуль # alias_method .Нам нужно использовать send
, потому что alias_method
является частным методом.
Теперь мы можем написать следующее.
Bar.instance_methods && [:detect, :boilerplate]
#=> [:detect, :boilerplate]
b = Bar.new
b.detect(:say)
b.detect("hey")
Bar.instance_methods(false)
#=> [:say, :hey]
b.say { |name| "My name is #{name}" }
#=> "My name is Spud"
b.hey { |name| "My name is #{name}" }
#=> "My name is Spud"