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

2つの内側の配列を足し合わせて、連結された配列に含まれていることを確認することはできませんか?

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

問題は、の戻り値がeachブール値(失われる)ではなく、繰り返される配列であるということです。配列はtrueであるため、返される値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]
于 2012-05-11T17:51:03.193 に答える