Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby在运行时从模块修改方法_Ruby_Metaprogramming - Fatal编程技术网

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

Ruby在运行时从模块修改方法,ruby,metaprogramming,Ruby,Metaprogramming,我有my_类,其中包含行为A的my_方法。在my_模块中,我有行为B的相同方法 为了动态修改my_类的行为,我尝试使用元编程在运行时更改方法 我如何使我的_类具有行为A,然后将其更改为行为AB,或B,然后返回到A 我想将以前版本的源代码保存在一个历史数组中,以便能够检索旧版本并还原它,但另一个线程告诉我,我们不能只获取方法的源代码 小例子: class MyClass def my_method puts "Hello" end end module World def m

我有
my_类
,其中包含行为A的
my_方法
。在
my_模块
中,我有行为B的相同方法

为了动态修改my_类的行为,我尝试使用元编程在运行时更改方法

我如何使
我的_类
具有行为A,然后将其更改为行为AB,或B,然后返回到A

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

小例子:

class MyClass
  def my_method
    puts "Hello"
  end
end

module World
  def my_method
    puts " World !"
  end
end

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

这不使用扩展,但我认为它更接近您的目标:

class-MyClass
def初始化
@节点=[]
@nodes.push(->({“hello 0”})
@nodes.push(->({“hello 1”})
@nodes.push(->({“hello 2”})
结束
定义my_方法(版本=0)
@节点[version]。调用
结束
结束
my_instance=MyHelloClass.new
my_实例。my_方法
#=>“你好,0”
my_实例。my_方法(1)
#=>“你好1”
my_实例。my_方法(2)
#=>“你好2”

alias\u方法
可能是您正在寻找的方法,或者可能是
super
您的问题有点不清楚您试图解决的问题是什么?“动态”修改方法行为(然后恢复原始版本)听起来像是你想要避免的事情。这与任何问题无关。我是ruby元编程的新手,希望学习如何做到这一点。Alias似乎很有希望,但就目标而言,我如何仍然执行旧方法行为(我可以使用一个特殊的关键字来触发旧方法行为,以便我可以在新方法中的任何位置执行旧代码),是的,再加上恢复到简单的“hello”的能力。但我认为这不是我想要的。我不想简单地添加参数或一条指令。我想在类的方法中添加模块的方法中的说明。本质上,有点像我的本地代码是git,在运行时我可以在函数中“提交”新代码,并在需要时返回到以前的版本。你能举个例子说明你希望如何引用这些不同的psudo分支吗?太好了!所以我考虑了一个链表,其中第一个节点是基本方法(在类内部),然后每次“添加”模块(这里是MyWorldModule),都会创建一个新节点。对该方法的调用将只调用最后一个节点(LIFO)上的方法,但使用关键字,我可以从上一个节点调用该方法。理想情况下,这将适用于未知数量的节点,其中每个节点都可以执行自己的代码,然后根据请求(或之前,取决于特殊关键字的位置)执行前一个节点的代码。这会让我们更接近吗?我认为lambdas可能是实现此功能的更好途径。然后,您可以管理一个简单的数组,而不是类的层次结构。如果你想要关键字而不是索引,你可以用散列替换数组。让我知道,如果有任何方法,我可以改变我的答案,以获得一个上升投票。此外,在解决此问题的过程中,您可能需要了解“define_method”、“method_missing”和“Class.祖先”方法。它们对于开始研究ruby元编程至关重要。祝你好运