你在寻找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
包括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')