Первоначально я неправильно истолковал вопрос (но оставил свой первоначальный ответ после горизонтальной линии ниже). Я считаю, что следующее может быть тем, что вы ищете.
class C1
[:m1, :m2].each do |m|
define_method(m) do |name|
@i_am = __method__
puts "I'm #{name} from method #{@i_am}"
end
end
end
C1.instance_methods(false)
#=> [:m1, :m2]
c1 = C1.new
#=> #<C1:0x007f94a10c0b60>
c1.m1 "Bob"
# I'm Bob from method m1
c1.m2 "Lucy"
# I'm Lucy from method m2
Мое первоначальное решение следующим образом.
class C1
def add_code_to_beginning(meth)
meth = meth.to_sym
self.class.send(:alias_method, "old_#{meth}".to_sym, meth)
self.class.send(:define_method, meth) do
yield
send("old_#{meth}".to_sym)
end
end
end
Module#alias_method и Module#define_method являются частными; следовательно, необходимо использовать send
.
c = C1.new
#=> #<C1:0x007ff5e3023650>
C1.instance_methods(false)
#=> [:m1, :m2, :add_code_to_beginning]
c.add_code_to_beginning(:m1) do
puts "hiya"
end
C1.instance_methods(false)
#=> [:m1, :m2, :add_code_to_beginning, :old_m1]
c.m1
# hiya
#=> :m1
Цель ваших примеров не ясна. – sawa
@sawa, нет, это не так. – Ramano
Рамано, акисты не в лучшем положении, чтобы определить, ясно ли их вопрос читателям. Я с @sawa на этом. –