`:|` 在 Ruby 中做什么?

What does `:|` do in Ruby?

我在另一个问题中发现了以下语法,但我一直无法找到有关其作用的任何文档 - 我假设某种语法糖:

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

我允许其中一个数组是 nil 而不是数组,并且看起来很有魅力。任何人都可以指出正确的方向以了解发生了什么吗?

原题在这里:Merge arrays if not nil and not empty

它是一个符号,和:test一样,但是是一个单字符符号。

reduce 的双参数版本接受方法名称作为第二个参数,在这种情况下方法的名称是 :|,或 | 方法。数组上的 | 是一个集合操作,它 "or" 将数组放在一起,为您提供两个数组中包含的所有元素的唯一超集。这不是 reduce 的特别惯用用法,您可以使用 .flatten.uniq

实现相同的目的

如果你想添加数字,你可以使用 :+,或者乘法你可以使用 :*.

和这个是一样的:

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

虽然它有语法糖,Array#| 是一种方法,您可以查看 here 的文档。正如文档所说:

Set Union — Returns a new array by joining ary with other_ary, excluding any duplicates and preserving the order from the original array

当 reduce 块采用这种特殊形式时(在 memo 上调用单个方法,将迭代的元素作为参数传递),您可以省略块并仅传递方法名称。