检查Ruby中数组是否存在值

我有一个价值'Dog'和数组['Cat', 'Dog', 'Bird']

如何检查它是否存在于数组中而不循环? 有没有简单的方法来检查值是否存在,仅此而已?


你正在寻找include?

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

有一个in? 方法在ActiveSupport (Rails的一部分)自v3.1以来,正如@campaterson所指出的那样。 所以在Rails中,或者如果你require 'active_support' ,你可以写:

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

OTOH,没有in运营商或#in? 方法,尽管之前已经提出过,特别是Yusuke Endoh是红宝石核心的顶尖成员。

正如其他人所指出的,相反的方法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')
链接地址: http://www.djcxy.com/p/641.html

上一篇: Check if a value exists in an array in Ruby

下一篇: How to write a switch statement in Ruby?