【问题标题】:join enumerable to produce string in Ruby加入可枚举以在 Ruby 中生成字符串
【发布时间】:2019-02-19 01:52:15
【问题描述】:

Ruby 数组具有 #join 方法,该方法通过连接数组元素并添加可选的分隔符来生成字符串。

范围等其他可枚举项没有相同的方法。

您可以使用#inject 模拟该行为,例如

('a'..'z').inject('') do |acc, s| 
  if acc.empty?
    s
  else
    acc << ' some separator ' << s.to_s  
  end
end

有没有更好的方法来加入枚举? #join 是否因特定原因被省略?

编辑:

我会担心的一件事是将大量可枚举复制到数组中。当然,这很少是用例,但仍然如此。例如:

(1 .. 1_000_000_000_000_000).to_a.join

因此,我对不需要生成包含所有值的数组作为中间步骤的解决方案特别感兴趣。

【问题讨论】:

  • “#join 因特定原因被省略” - 一些可枚举项是无限的。数组永远不会。
  • 我怀疑我理解编辑部分的要求。如果你想在不转换为数组的情况下加入,你可以像你一样inject
  • JFYI,您建议用inject 替换已损坏。但是,是的,这是一种有效的方法。
  • “#join 是否因特定原因被省略” -- #join 是否随时出现?
  • @SergioTulentsev 谢谢。修好了。

标签: ruby string enumerable


【解决方案1】:

使用Array#join:

('a'..'z').to_a.join(' some separator ')

或者(实际上相同):

[*'a'..'z'].join(' some separator ')

【讨论】:

  • 感谢您的回答。这绝对是一个解决方案。请参阅我的编辑了解更多详细信息。
  • @SergioTulentsev 在 OP 中 这也有点高 :)
【解决方案2】:
> [*'a'..'z'] * ' some separator '

#=> "a some separator b some separator c some separator d some separator e some separator f some separator g some separator h some separator i some separator j some separator k some separator l some separator m some separator n some separator o some separator p some separator q some separator r some separator s some separator t some separator u some separator v some separator w some separator x some separator y some separator z"

【讨论】:

  • * 的酷用。但语义与join不同,因为分隔符是在输出中'a'之前插入的。
  • 好的,我现在已经修复了问题中的示例。它应该是join语义。
猜你喜欢
  • 2020-03-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 2016-12-22
相关资源
最近更新 更多