Ruby数组合并方法

时间:2019-02-17 23:32:56

标签: arrays ruby

我正在寻找一种与Array#|等效的方法,并且该方法的名称用普通的单词表示。

a = [1, 2, 3]
b = [3, 4, 5]
a|b # => [1, 2, 3, 4, 5]

我不是在寻找新方法。我可以编写将完成此操作的任何方法。那不是我要的我想知道是否有别名。是否有类似a.merge(b)的方法在2.5.1中不是数组的有效方法?

在版本2.5.1的文档中描述了|Array.union(another_array)相同。但这会引发错误。

a.union(b) # >> undefined method `union' for [1, 2, 3]:Array (NoMethodError)

union有这样一种书面方法吗?

2 个答案:

答案 0 :(得分:3)

Array#union在Ruby 2.6中可以正常工作,但是如果不是在Ruby 2.5中并且您坚持使用名为union的方法,那么以下内容在Ruby 2.3.7中对我来说就像是冠军: / p>

[1,2,3].union [4,5,6]  # => NoMethodError: undefined method `union' for [1, 2, 3]:Array

class Array
  def union(other)
    self | other
  end
end

[1,2,3].union [4,5,6]  # => [1, 2, 3, 4, 5, 6]

要获得与2.6的Array#union所记录的Ruby早期版本中的行为相当的功能:

class Array
  def union(*others)
    others.inject(self, &:|)
  end
end

[1,2].union [3,4], [5]  # => [1, 2, 3, 4, 5]
[10,11].union           # => [10, 11] 

答案 1 :(得分:2)

即使在Ruby 2.6中,Array#|也没有确切的等效项。

Array#unionarray.c#rb_ary_union_multi中实现,而Array#|array.c#rb_ary_or中实现。

对于小数组(少于16个元素),它们都在内部使用rb_ary_union,对于大数组,它们都使用rb_ary_union_hash,但是rb_ary_union_multi接受两个以上的参数:

a = [1, 2, 3]
b = [3, 4, 5]
c = [4, 5, 6]

a.union(b, c)
# => [1, 2, 3, 4, 5, 6]
a.|(b, c)
# ArgumentError (wrong number of arguments (given 2, expected 1))