3

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

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

4

3 回答 3

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]
于 2012-05-11T18:56:06.557 回答
1

你不能把两个内部数组加在一起,然后检查连接数组中的包含吗?

[1,2,3].delete_if do |n|
  !([2,4,5] + [3,6,7]).include?(n)
end
于 2012-05-11T17:50:38.237 回答
0

问题是 的返回值each是被迭代的数组,而不是布尔值(丢失了)。由于数组为真,返回的值delete_if始终为真,因此所有元素都被删除。您应该改用any?

[1,2,3].delete_if do |n|
  ![[2,4,5], [3,6,7]].any? do |m|
    m.include?(n)
  end
end
#=> [2, 3]
于 2012-05-11T17:51:03.193 回答