首页 > 解决方案 > 如何在某些条件下覆盖红宝石宝石的方法?

问题描述

我试图仅在满足某些条件时才覆盖 gem 的私有方法之一。

我只想在满足特定条件时使用此方法,否则使用 gem 的方法。

module Net
  class FTP
    def makepasv
      if condition
        @sock.peeraddr[0] == 'AF_INET' ? parse229(sendcmd('EPSV')) : parse227(sendcmd('EPSV'))
      else
        super
      end
    end
  end
end

标签: ruby-on-railsruby

解决方案


您可以prepend覆盖被覆盖的类,然后使用条件。这样,您的模块将是祖先链中的最后一个,并且能够调用super以使用默认行为

例如

module Override 
  def to_s(*) 
    if self == 'a'
      "===a===" 
    else 
      super 
    end
  end 
end
String.prepend(Override)

[9] pry(main)> String.new("a")
=> "a"                                                                                                            
[10] pry(main)> String.new("a").to_s
=> "===a==="
[11] pry(main)> String.new("b").to_s
=> "b"

推荐阅读