动态地向方法添加语句

时间:2015-10-05 17:15:51

标签: ruby

我有一堂课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中作为参数传递的代码。

2 个答案:

答案 0 :(得分:1)

您想使用alias_method_chainModule#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'。