我有一堂课Foo:
class Foo
def a
"something" if true
end
end
我想要一个add_statement
方法向方法添加新语句,保留旧的实现。有可能吗?
我想做这样的事情:
foo = Foo.new
foo.extend_method(:a, &block)
所以现在a
方法的来源应该是这样的:
def a
"something" if true
&block
end
其中&block
是我在extend_method
中作为参数传递的代码。
答案 0 :(得分:1)
您想使用alias_method_chain
或Module#prepend
。
网上有很多关于它们的教程/文档,例如" AVOIDING ALIAS_METHOD_CHAIN IN RUBY"或" Module.prepend: a super story"。
对于您的特定示例(当您希望将该函数扩展到类之外时),您必须使用alias_method_chain
,添加到新模块中,并使用Foo.send
包含在原始类中。
您可以在" When to use alias_method_chain"。
中找到更多详细信息和示例答案 1 :(得分:0)
这是一个面向方面的例子:
require 'aspector'
class Foo
def a
puts "in Foo.a"
end
end
aspect = Aspector do
before :a do
puts 'this should print first'
end
after :a do |result_of_a|
puts 'this should print last'
end
end
puts "\n\nplain instance"
foo = Foo.new
foo.a
puts "\n\napply to an instance"
aspect.apply(foo)
foo.a
puts "\n\napply to all instances of Foo"
aspect.apply(Foo)
Foo.new.a
您需要安装gepector'。