【问题标题】:Ruby array merge methodRuby数组合并方法
【发布时间】:2019-02-17 23:32:56
【问题描述】:

我正在寻找一个等价于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有这样的写法吗?

【问题讨论】:

  • a.|(b)。你觉得这书面够吗?
  • 好的。 a | b 现在是为你写的。可能是(a + b).uniq 写得更多?
  • union 是在 2.6 中引入的,它在 2.5 中不可用,您是正确的,因为它似乎没有替代命名方法 | (这可能是他们添加 union 的原因/跨度>
  • 我在ruby-doc.org/core-2.5.1/Array.html 上没有看到名为union 的方法。您正在查看其他文档吗?
  • 顺便说一句,Ruby 2.6 中的union 不仅仅是| 的别名——与运算符不同,它可以接受多个 参数。就像push vs <<

标签: arrays ruby


【解决方案1】:

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]

在早期版本的 Ruby 中获得与 2.6 的 Array#union 记录行为相当的功能:

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] 

【讨论】:

  • 那你需要重写问题。您明确表示“我正在寻找书面方法”。由于不存在,因此如果您需要,很容易编写一个。如果这不是您的需要,请更明确地解释您的需要。
  • 是的,已经存在。我进一步解释了文档如何引导我找到.unionLooking for,不要求为我写一份,我有能力做,作为我原始帖子中的证据。
  • 啊,所以你没有编码问题。您希望其他人确认没有特定的实现功能,您可以通过直接测试来观察。在那种情况下,我认为您的问题没有任何意义。
  • 或者:others.inject(self, &:|) - 更简洁,不会改变论点。
  • @Stefan 非常优雅,我已经相应地修改了我的答案。
【解决方案2】:

Array#| 没有精确的等价物,即使在 Ruby 2.6 中也是如此。

Array#unionarray.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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 2020-02-14
    • 2015-07-10
    • 1970-01-01
    • 2022-11-16
    • 2013-12-20
    • 2011-11-19
    相关资源
    最近更新 更多