协慌网

登录 贡献 社区

检查 Ruby 中的数组中是否存在值

我有一个值'Dog'和一个阵列['Cat', 'Dog', 'Bird']

如何在没有循环的情况下检查数组中是否存在?是否有一种简单的方法来检查值是否存在,仅此而已?

答案

你在寻找include?

>> ['Cat', 'Dog', 'Bird'].include? 'Dog'
=> true

有一个in?方法ActiveSupport因为 V3.1(滑轨的一部分),如通过 @campaterson 指出。所以在 Rails 中,或者如果你require 'active_support' ,你可以写:

'Unicorn'.in?(['Cat', 'Dog', 'Bird']) # => false

OTOH,也没有in运营商或#in? Ruby 本身的方法,尽管之前已经提出过, 特别是 Yusuke Endoh是 ruby-core 的顶级成员。

正如其他人所指出的,反向方法include?存在,对于所有Enumerable包括ArrayHashSetRange

['Cat', 'Dog', 'Bird'].include?('Unicorn') # => false

请注意,如果数组中有许多值,它们将一个接一个地检查(即O(n) ),而散列的查找将是恒定时间(即O(1) )。因此,例如,如果数组是常量,则最好使用Set 。例如:

require 'set'
ALLOWED_METHODS = Set[:to_s, :to_i, :upcase, :downcase
                       # etc
                     ]

def foo(what)
  raise "Not allowed" unless ALLOWED_METHODS.include?(what.to_sym)
  bar.send(what)
end

快速测试显示调用include?在 10 个元素Set上比在等效Array上调用它快 3.5 倍(如果找不到该元素)。

最后结束语:使用include?时要小心include?Range ,有细微之处,所以请参考文档并与cover?进行比较cover? ...

尝试

['Cat', 'Dog', 'Bird'].include?('Dog')