2

可能重复:
当猴子修补方法时,您可以从新实现中调用覆盖的方法吗?

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

IE。

方法存在

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

我想添加

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

有任何想法吗?

4

3 回答 3

8
alias :old_fake_method :fake_method
def fake_method(cmd)
  if (cmd) == "bla"
    puts "caught cmd"
  else
    old_fake_method(cmd)
  end
end
于 2013-01-18T18:33:16.083 回答
2

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

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"

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

于 2013-01-18T18:33:10.143 回答
0

为此,ruby 中有alias_method_chainalias_method 。

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

于 2013-01-18T18:28:09.207 回答