Check if a value exists in an array in Ruby

I have a value 'Dog' and an array ['Cat', 'Dog', 'Bird'] .

How do I check if it exists in the array without looping through it? Is there a simple way of checking if the value exists, nothing more?


You're looking for include? :

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

There is an in? method in ActiveSupport (part of Rails) since v3.1, as pointed out by @campaterson. So within Rails, or if you require 'active_support' , you can write:

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

OTOH, there is no in operator or #in? method in Ruby itself, even though it has been proposed before, in particular by Yusuke Endoh a top notch member of ruby-core.

As pointed out by others, the reverse method include? exists, for all Enumerable s including Array , Hash , Set , Range :

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

Note that if you have many values in your array, they will all be checked one after the other (ie O(n) ), while that lookup for a hash will be constant time (ie O(1) ). So if you array is constant, for example, it is a good idea to use a Set instead. Eg:

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

A quick test reveals that calling include? on a 10 element Set is about 3.5x faster than calling it on the equivalent Array (if the element is not found).

A final closing note: be wary when using include? on a Range , there are subtleties, so refer to the doc and compare with cover? ...


尝试

['Cat', 'Dog', 'Bird'].include?('Dog')
链接地址: http://www.djcxy.com/p/642.html

上一篇: 如何从shell脚本获取密码而不回显

下一篇: 检查Ruby中数组是否存在值