在阵列上循环

时间:2012-05-11 17:45:51

标签: ruby

我在找出正确的方法时遇到了一些麻烦:

我有一个数组和一个单独的数组数组,我想与第一个数组进行比较。第一个数组是一个特殊的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对象。我确信这比我正在尝试的解释要简单得多。有人有什么想法吗?

3 个答案:

答案 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]
相关问题