【问题标题】:How to improve this ruby code more idiomatic?如何改进这个 ruby​​ 代码更惯用?
【发布时间】:2012-12-26 13:36:10
【问题描述】:

因为下面的代码看起来很陈旧且丑陋。但是在玩这种方式之后只是工作。

def duplicated? url
  found = false
  current_user.bookmarks.each do |bookmark|
    if bookmark.url.eql? url
      found = true
    end
  end
  found
end

我消除了找到的本地变量和这样的 if 语句

def duplicated? url
  current_user.bookmarks.each do |bookmark|
    bookmark.url.eql? url
  end
end

它返回错误的预期结果。

知道如何改进它吗?谢谢

【问题讨论】:

标签: ruby


【解决方案1】:

我认为你需要Enumerable#any?。应该首选映射/包含对,因为它不会创建临时数组,并且会在找到第一个元素时提前返回。

def duplicated? url
  current_user.bookmarks.any?{|b| b.url.eql? url }
end

【讨论】:

  • 很公平。我错过了书签不是 url 的部分,所以首先想到的是 include。我 +1:ed 你的答案。
【解决方案2】:
def duplicated?(url)
   current_user.bookmarks.map{|bm| bm.url}.include?(url)
end

【讨论】:

  • 你为什么发布这个?它复制了 Jean-Louis Giordano 的答案。
  • 我在他没有做map()的时候发了这个,当时他的回答是不正确的。另外,我显式地映射,因为 map(&:...) 会引起很快成为问题的演员表。
  • 虽然我怀疑“它会很快成为一个问题”。我在实践中从未遇到过这个问题。
  • 我从来没有遇到过to_proc 的问题,对我来说,代码可读性比性能更重要(否则,为什么要选择 ruby​​?)。所以我会说这纯粹是一个品味问题。
  • @Jean-LouisGiordano 确实,很高兴知道有一个选择。
猜你喜欢
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
  • 2012-07-23
相关资源
最近更新 更多