通过覆盖向方法添加功能,但仍调用原始方法

时间:2013-01-18 18:24:47

标签: ruby

  

可能重复:
  When monkey patching a method, can you call the overridden method from the new implementation?

所以我希望通过覆盖它来简单地向方法添加一些条件检查,但是我希望调用原始方法。如何在红宝石中做到这一点?

方法存在

def fakeMethod(cmd)
  puts "#{cmd}"
end

我要添加

if (cmd) == "bla"
  puts "caught cmd"
else
  fakeMethod(cmd)
end

有什么想法吗?

3 个答案:

答案 0 :(得分:8)

alias :old_fake_method :fake_method
def fake_method(cmd)
  if (cmd) == "bla"
    puts "caught cmd"
  else
    old_fake_method(cmd)
  end
end

答案 1 :(得分:1)

为什么不使用继承。这是一个经典的例子,重写的方法增加了额外的逻辑:

class Foo
  def foo(cmd)
    puts cmd
  end
end

class Bar < Foo
  def foo(cmd)
    if cmd == "hello"
      puts "They want to say hello!"
    else
      super
    end
  end
end

Foo.new.foo("bar")   # => prints "bar"
Bar.new.foo("hello") # => prints "They want to say hello"

当然,只有在您有机会实例化子类实例时,此解决方案才有效。

答案 2 :(得分:0)

ruby​​中有alias_method_chainalias _方法。

(alias_method_chain不在ruby中,但在ActiveSupport :: CoreExtensions中,所以如果这不是rails应用程序,你需要要求它)