Ruby在运行时从模块修改方法

时间:2018-03-13 14:04:01

标签: ruby metaprogramming

我的my_class包含my_method行为A. my_module我的行为B采用相同的方法。

想要动态修改my_class的行为,我尝试使用元编程在运行时更改方法。

如何让my_class有行为A,然后将其更改为行为AB或B,然后再回到A?

我想将以前版本的源代码保存在历史数组中,以便我能够检索旧版本并恢复它,但另一个线程告诉我,我们不能只获取方法的源代码。

小例子:

class MyClass
  def my_method
    puts "Hello"
  end
end

module World
  def my_method
    puts " World !"
  end
end

然后,在运行时我可以调用my_method,结果为“Hello”,然后让模块中的方法扩展该方法,它将打印“Hello World!” (在两行中,这不是重点,我不寻求“合并”它们)

1 个答案:

答案 0 :(得分:1)

这并没有使用扩展程序,但我认为它更接近你的追求:

class MyClass
  def initialize
    @nodes = []
    @nodes.push( ->() {"hello 0"})
    @nodes.push( ->() {"hello 1"})
    @nodes.push( ->() {"hello 2"})
  end

  def my_method(version = 0)
    @nodes[version].call
  end
end

my_instance = MyHelloClass.new
my_instance.my_method
#=> 'hello 0'
my_instance.my_method(1)
#=> 'hello 1'
my_instance.my_method(2)
#=> 'hello 2'