【问题标题】:Does overriding hash and eql in ruby affect performance?在 ruby​​ 中覆盖 hash 和 eql 会影响性能吗?
【发布时间】:2013-06-03 10:38:03
【问题描述】:

以下内容会对性能产生多大影响?我担心这可能会产生很大的影响,因为我到处都在使用它。我不确定它们每个的调用位置(即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

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

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

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

    url = self.url 是记忆。


    你最初有五个条件使它成为现实:
    • 不是其他 == 错误
    • 不是 url == nil
    • 不是其他 == 无
    • 不是 other.url == nil
    • url == other.url

    其中,

    • 通过将url 放入条件中,可以将No1 和No3 放在一起。
    • No4 在 No2 和 No5 下是多余的,因为如果 url 不是 nil,并且 other.urlurl,那么 other.url 不是 nil

    【讨论】:

    • 谢谢@sawa,我不明白。作业如何与逻辑相结合,你能帮我解释一下吗?我想我不明白 url = self.url 作为条件?
    • 我只是不明白这是如何记忆的,因为代码块“每次”都会执行......??
    • 它调用一次而不是两次。
    • 当我运行这段代码并调用 .eql?重复,它每次都执行代码(即当我添加开始时;结束代码)
    猜你喜欢
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 2012-02-04
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多