Метод объединения массивов Ruby - PullRequest
0 голосов
/ 18 февраля 2019

Я ищу метод, который эквивалентен 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 голосов
/ 18 февраля 2019

Точного эквивалента для Array#| нет, даже в Ruby 2.6.

Array#union реализовано в array.c#rb_ary_union_multi, а Array#| реализован в array.c#rb_ary_or.

Они оба используют rb_ary_union под колпаком для небольших массивов (менее 16 элементов) и rb_ary_union_hash для больших массивов, но rb_ary_union_multi принимает более 2 аргументов:

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))
0 голосов
/ 18 февраля 2019

Array#union отлично работает в Ruby 2.6, но если он не в Ruby 2.5 и вы настаиваете на том, чтобы у вас был метод с именем union, то в Ruby 2.3.7 у меня сработало следующее:

[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] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...