我有一个值'Dog'和一个数组['Cat', 'Dog', 'Bird']。
如何检查它是否存在于数组中而不遍历它?有没有简单的方法检查值是否存在,仅此而已?
有一种in?方法在ActiveSupport(滑轨的一部分),因为V3.1,如通过@campaterson指出。因此,在Rails中,或者,如果您可以require 'active_support',您可以编写:
'Unicorn'.in?(['Cat', 'Dog', 'Bird']) # => false
OTOH,Ruby本身没有in运算符或#in?方法,即使以前已经提出过,特别是由红宝石核心的顶尖成员远藤裕介提出的。
如其他人指出的那样,反向方法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约3.5倍比调用它的等效快Array(如果未找到该元素)。
最后的闭注:使用时要小心include?上Range,也有细微之处,所以要参考的文档,并与比较cover?...
问题来源于stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。