我在找出正确的方法时遇到了一些麻烦:
我有一个数组和一个单独的数组数组,我想与第一个数组进行比较。第一个数组是一个特殊的Enumerable
对象,碰巧包含一个数组。
逻辑告诉我,我应该能够做到这一点:
[1,2,3].delete_if do |n|
[[2,4,5], [3,6,7]].each do |m|
! m.include?(n)
end
end
我期望回归 => [2,3]
但它会返回[]
。
如果我这样做,这个想法就有用了:
[1,2,3].delete_if do |n|
! [2,4,5].include?(n)
end
它会返回
=> [2]
我无法将值分配给另一个对象,因为[1,2,3]
数组必须保留其特殊的Enumerable
对象。我确信这比我正在尝试的解释要简单得多。有人有什么想法吗?
答案 0 :(得分:2)
您还可以展平多维数组并使用Array#&交点运算符来获得相同的结果:
# cast your enumerable to array with to_a
e = [1,2,3].each
e.to_a & [[2,4,5], [3,6,7]].flatten
# => [2, 3]
答案 1 :(得分:1)
难道你不能只将两个内部数组一起添加,并检查连接数组中的包含吗?
[1,2,3].delete_if do |n|
!([2,4,5] + [3,6,7]).include?(n)
end
答案 2 :(得分:0)
问题是each
的返回值是迭代的数组,而不是布尔值(丢失)。由于数组是真实的,返回delete_if
的值始终为true,因此删除所有元素。您应该使用any?
:
[1,2,3].delete_if do |n|
![[2,4,5], [3,6,7]].any? do |m|
m.include?(n)
end
end
#=> [2, 3]