2

我发现很难找到这个问题的答案。

有人曾经向我展示了如何在数组中查找公共元素:

> colours1 = %w(red green blue)
> colours2 = %w(orange red black blue)
> colours1 & colours2
=> ["red", "blue"]

但是我不明白'&'在这段代码中的作用,它是如何找到共同元素的?

4

2 回答 2

2

因为它是这样定义的。该Array#&方法采用另一个数组并返回交集。

于 2013-08-01T09:13:52.020 回答
2

为了回答它的作用,我引用以下文档Array#&

Set Intersection — 返回一个新数组,其中包含两个数组共有的元素,不包括任何重复项。顺序从原始数组中保留。

至于它是如何做到的,我向您指出1的rubinius 实现Array#&

def &(other)
  other = Rubinius::Type.coerce_to other, Array, :to_ary

  array = []
  im = Rubinius::IdentityMap.from other

  each { |x| array << x if im.delete x }

  array
end

仅使用(第一个数组)each { |x| array << x if im.delete x }中的元素被self添加到返回的数组中,如果它们包含在other数组中。


1请注意,c-ruby 实现的东西与 rubinius 或 jruby 实现的略有不同。但它应该让您了解正在发生的事情。

于 2013-08-01T09:14:38.853 回答