【问题标题】:What does `:|` do in Ruby?`:|` 在 Ruby 中的作用是什么?
【发布时间】:2019-03-01 07:53:51
【问题描述】:

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

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

我允许其中一个数组是nil 而不是数组,并且看起来像一个魅力。谁能指出我正确的方向以了解发生了什么?

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

【问题讨论】:

标签: ruby syntactic-sugar


【解决方案1】:

它是一个符号,就像:test,但只是一个字符符号。

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

如果你想把数字相加,你可以使用:+,或者相乘你可以使用:*

【讨论】:

  • 值得一提的是,这个对reduce 的特定调用中的第一个参数是多余的,...reduce(:|) 就足够了。此外,flatten.uniq 无论如何都值得(除非我们确定所有数组都很小。)与reduce 相比,它可能会消耗二次内存。
  • @mudasobwa 第一个参数在输入数组为空的情况下是必需的,但您希望reduce 无论如何都返回一个数组。
  • @meager 如果第一个数组为空([]),它仍然会返回一个数组。如果是零,那就另当别论了。在这种情况下,被迭代的元素没有相同的接口,所以它可能会引发 NoMethodError
  • @maxpleaner 我说的是输入数组为空[].reduce(:|) #=> nil[].reduce([], :|) # => [].
【解决方案2】:

和这个是一样的:

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

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

Set Union — 通过将 ary 与 other_ary 连接返回一个新数组,排除任何重复项并保留原始数组的顺序

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 2012-03-30
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多