`:|` 在 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 上调用单个方法,将迭代的元素作为参数传递),您可以省略块并仅传递方法名称。
我在另一个问题中发现了以下语法,但我一直无法找到有关其作用的任何文档 - 我假设某种语法糖:
[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 上调用单个方法,将迭代的元素作为参数传递),您可以省略块并仅传递方法名称。