【问题标题】:evaluate if array has any items in ruby评估数组是否在 ruby​​ 中有任何项目
【发布时间】:2012-05-07 17:32:18
【问题描述】:

有没有更好的方法来声明这个?

if current_user.received_replies.unread.count > 0

我要做的是仅当至少有一个 unread 对象时才匹配条件。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3


    【解决方案1】:
    unless current_user.received_replies.unread.empty?
      # ...
    end
    

    或者,如果您的 ifelse,请切换大小写(因为 unless/else 太丑了):

    if current_user.received_replies.unread.empty?
      # ...
    else
      # ...
    end
    

    【讨论】:

      【解决方案2】:

      我会使用:

      if current_user.received_replies.unread.any?
      

      来自文档:

      = Array.any? (来自红宝石核心) === 从 Enumerable 实现 -------------------------------------------------- ---------------------------- 枚举。任何? [{|对象|块 } ] -> 真或假 -------------------------------------------------- ---------------------------- 将集合的每个元素传递给给定的块。方法返回 如果块曾经返回 false 或 nil 以外的值,则返回 true。如果块 没有给出,Ruby 添加了 {|obj| 的隐式块obj} (那是什么?将 如果至少有一个集合成员不是 false 或 nil,则返回 true。 %w{蚂蚁熊猫}.any? {|字| word.length >= 3} #=> 真 %w{蚂蚁熊猫}.any? {|字| word.length >= 4} #=> 真 [无,真实,99]。任何吗? #=> 真

      【讨论】:

      • 如果列表包含虚假项目,则不完全等效。在ActiveRecord 的域中,它可能是可行的,但我看到很多对此感到困惑,人们认为这只是empty? 的否定,这通常不是真的。
      • @NiklasB。哇,我从来没有注意到这一点。 [false].any?false 有点讨厌。
      • @Andrew:为什么不呢?通常,此功能是检查谓词是否适用于任何项,例如[1,2,3].any? { |x| x > 2 }。不幸的是,它也可以在没有块的情况下工作(我看不出它在哪里有用)。
      • @NiklasB。好吧,这就是我的观点,没有块的版本具有误导性,并且似乎并没有立即传达其对真实性的检查。我同意它不应该存在。
      • 我发现非块版本非常有用,但后来我知道我的数组将包含真实元素。如果您不知道数组中有什么,该块非常适合提供对元素的更深入检查。如果我有一个未知元素类型的数组,我认为我有一个比any? 是否在没有块的情况下工作更大的问题。
      【解决方案3】:

      这可能会好一点:

      unless current_user.received_replies.unread.empty?
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-31
        • 2015-04-06
        • 1970-01-01
        • 1970-01-01
        • 2011-05-21
        • 2013-07-25
        • 1970-01-01
        相关资源
        最近更新 更多