检查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
包括Array
, Hash
, Set
, Range
:
['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