重写ruby中的hash和eql会影响性能吗?

时间:2013-06-02 05:49:22

标签: ruby-on-rails ruby

以下会影响性能多少?我担心这可能会产生很大影响,因为我到处都使用它。我不确定每个被调用的位置(即include?调用这些方法,|}也是如此,但任何其他主要方法都可能导致性能下降。

class Source
  def hash
    url.hash
  end
  def ==(other)
    eql?(other)
  end
  def eql?(other)
    return false if other == false || url == nil || other == nil || other.url == nil
    url == other.url
  end
end

1 个答案:

答案 0 :(得分:5)

覆盖方法本身不会影响性能,但方法的实现很重要。你的方法很糟糕,因为它有多余的东西。它可以更好地写成:

def eql?(other)
  url = self.url and other and url == other.url
end

url = self.url是记忆。

<小时/> 您最初有五个条件可以实现:

  • 不是其他== false
  • not url == nil
  • 不是其他== nil
  • not other.url == nil
  • url == other.url

其中,

  • url置于条件中,可以将No1和No3放在一起。
  • No4在No2和No5下是多余的,因为如果url不是nilother.urlurl,则other.url不是nil }。