Is there a better way to write this:
if myarray.include? 'val1' ||
myarray.include? 'val2' ||
myarray.include? 'val3' ||
myarray.include? 'val4'
Using set intersections (Array#:&):
(myarray & ["val1", "val2", "val3", "val4"]).present?
You can also loop (any? will stop at the first occurrence):
myarray.any? { |x| ["val1", "val2", "val3", "val4"].include?(x) }
That's ok for small arrays, in the general case you better have O(1) predicates:
values = ["val1", "val2", "val3", "val4"].to_set
myarray.any? { |x| values.include?(x) }
With Ruby >= 2.1, use Set#intersect:
myarray.to_set.intersect?(values.to_set)
if myarray.include? ['val1', 'val2', 'val3'] If not, then I guess your answer seems best.(self & other).any? instead of !(self & other).empty?any? and empty?, from a performance point of view, you're indeed right to use the negative form (empty? just checks the length of the C array, while any? involves a more complex process because of the absent block). I learned something today.Create your own reusable method:
class String
def include_any?(array)
array.any? {|i| self.include? i}
end
end
"a string with many words".include_any?(["a", "string"])