如何在Ruby中向现有方法定义添加语句

时间:2011-08-06 12:15:35

标签: ruby metaprogramming

我注意到了类定义,如果我打开class MyClass,并在中间添加一些内容而不覆盖,我仍然得到之前定义的原始方法。新增的声明增加了现有声明。

但是对于方法定义,我仍然希望与类定义具有相同的行为,但是当我打开def my_methoddef和{{1}中的现有语句时,似乎被覆盖了,我需要再次重写。

那么有没有办法让方法定义与定义相同,比如end,但不一定是子类?

2 个答案:

答案 0 :(得分:9)

我想你正在寻找alias_method

class A
  alias_method :old_func, :func

  def func
    old_func # similar to calling 'super'
    # do other stuff
  end
end

答案 1 :(得分:0)

@emboss,如果你不想在old_func之后执行代码,如果它包含条件返回怎么办?你可以在Rails中看到它类似 before_action 。 例如:

class MyClass
  alias_method :old_func, :func

  def aloha
    puts 'Something'
    return smth if other_thing
    puts 'End of method'
  end

  def func
    aloha # Don't call :old_func if aloha return condition is true
    old_func
  end
end

MyClass.new.func # Should return <smth> from aloha method.

这意味着语句应该逐行在同一个上下文中执行。