在某些条件下如何覆盖红宝石宝石的方法?

时间:2018-11-15 10:33:44

标签: ruby-on-rails ruby

我仅在满足某些条件时才尝试覆盖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

1 个答案:

答案 0 :(得分:3)

您可以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"