我是红宝石的新手,我一直在谷歌搜索几个小时,但我无法想象这一个。它看起来应该很容易,所以我很沮丧。
我在ruby工作,需要比较2个符号数组才能获得真或假的回报。
array1 = [:a, :c]
array2 = [:a, :b, :c]
我需要做的比较是查看array2是否包含array1的所有元素。 在这种情况下,array2包含array1,但array1不包含array2。
我试过了:
array2.to_s.include?(array1.to_s)
如果它们的顺序相同,则只返回true,因为它需要转换为字符串进行比较。因此它返回false(不是我正在寻找的),但是如果array2 = [:a,:c,:b]那将是真的。是否有更合适的方法进行比较?
答案 0 :(得分:1)
你可以使用 - 。 e.g:
array1 - array2 #=> returns empty array, if array2 include all array1 elements.
希望这可以解决您的问题。
答案 1 :(得分:1)
subset?
method,看看它的来源,我们看到它简短而甜蜜:
def subset?(set)
set.is_a?(Set) or raise ArgumentError, "value must be a set"
return false if set.size < size
all? { |o| set.include?(o) }
end
我们可以从数组中实例化两个Set对象并将其称为一天,但是将它提炼成直接在它们上运行的oneliner也很容易:
array1 = [:a, :c]
array2 = [:a, :b, :c]
array1.length < array2.length && array1.all? {|el| array2.include? el }
# => true
array1 << :z
array1.length < array2.length && array1.all? {|el| array2.include? el }
# => false
答案 2 :(得分:0)
您可以将此方法添加到Array类。
#!/usr/bin/env ruby
class Array
def includes_other(arr)
raise "arr must be an Array" unless arr.kind_of? Array
return (arr - self).length == 0
end
end
arr1 = [:a, :c, :e]
arr2 = [:e, :a, :c, :d]
puts arr2.includes_other(arr1) # prints true
arr3 = [:x, :c, :e]
puts arr3.includes_other(arr1) # prints false