Что `: |` делает в Ruby? - PullRequest
       46

Что `: |` делает в Ruby?

0 голосов
/ 25 сентября 2018

Я нашел следующий синтаксис в другом вопросе, и я не смог найти никакой документации о том, что он делает - я предполагаю синтаксический сахар некоторого вида:

[array1, array2, array3, array4].compact.reduce([], :|)

Я допускаю, чтобы один из массивов был nil вместо массива, и, кажется, работает как шарм.Кто-нибудь может указать мне правильное направление, чтобы понять, что происходит?

Оригинальный вопрос здесь: Объединение массивов, если не ноль и не пусто

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Это то же самое, что и это:

[array1, array2, array3, array4].compact.reduce([]) do |memo, array|
  memo | array
end

Несмотря на синтаксический сахар, Array#| - это метод, который вы можете увидеть в документах для здесь .Как сказано в документации:

Set Union - возвращает новый массив, объединяя ary с other_ary, исключая любые дубликаты и сохраняя порядок из исходного массива

Когда блокРедакция принимает эту конкретную форму (вызов одного метода в memo, передача элемента итерации в качестве аргумента), вы можете опустить блок и просто передать имя метода.

0 голосов
/ 25 сентября 2018

Это символ, такой как :test, но символ из одного символа.

Версия с двумя аргументами reduce принимает в качестве второго аргумента имя метода, в данном случае имя методаэто :| или | метод.| для массивов - это операция множеств, это "или" массивы вместе, что дает вам уникальный расширенный набор всех элементов, содержащихся в обоих массивах.Это не особо идиоматическое использование reduce, вы можете добиться того же с помощью .flatten.uniq

Если вы хотите добавить числа, вы можете использовать :+, или для умножения вы можете использовать:*.

...