所以我希望通过覆盖它来简单地向方法添加一些条件检查,但是我希望调用原始方法。如何在红宝石中做到这一点?
IE。
方法存在
def fakeMethod(cmd)
puts "#{cmd}"
end
我想添加
if (cmd) == "bla"
puts "caught cmd"
else
fakeMethod(cmd)
end
有任何想法吗?
所以我希望通过覆盖它来简单地向方法添加一些条件检查,但是我希望调用原始方法。如何在红宝石中做到这一点?
IE。
方法存在
def fakeMethod(cmd)
puts "#{cmd}"
end
我想添加
if (cmd) == "bla"
puts "caught cmd"
else
fakeMethod(cmd)
end
有任何想法吗?
alias :old_fake_method :fake_method
def fake_method(cmd)
if (cmd) == "bla"
puts "caught cmd"
else
old_fake_method(cmd)
end
end
为什么不使用继承。这是一个经典的例子,被覆盖的方法增加了额外的逻辑:
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"
当然,此解决方案仅在您有机会实例化子类实例时才有效。
为此,ruby 中有alias_method_chain和alias_method 。
(alias_method_chain 不在 ruby 中,但在 ActiveSupport::CoreExtensions 中,所以如果这不是 rails 应用程序,您可能需要要求)