【问题标题】:Add functionality to a method by overriding, but still call original method [duplicate]通过覆盖向方法添加功能,但仍调用原始方法[重复]
【发布时间】:2013-01-02 12:51:36
【问题描述】:

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

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

即。

方法存在

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

我想添加

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

有什么想法吗?

【问题讨论】:

标签: ruby


【解决方案1】:
alias :old_fake_method :fake_method
def fake_method(cmd)
  if (cmd) == "bla"
    puts "caught cmd"
  else
    old_fake_method(cmd)
  end
end

【讨论】:

    【解决方案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"
    

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

    【讨论】:

      【解决方案3】:

      在 ruby​​ 中有 alias_method_chainalias_method 。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多