在Ruby中连接enumerable以生成字符串

nmpmafwu  于 2023-08-04  发布在  Ruby
关注(0)|答案(3)|浏览(91)

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


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

pod7payv

pod7payv1#

使用Array#join

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

字符串
或(实际上相同):

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

p8h8hvxi

p8h8hvxi2#

> [*'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"

字符串

lf5gs5x2

lf5gs5x23#

你的问题中的代码已经是最优的了,但是可以删除你的块中的条件:

e = ('a'..'z').to_enum

joined_string = e.reduce { |acc, str| acc << ' some separator ' << str }.to_s

字符串
如果不向#reduce传递参数,则第一次调用该块时,accstr将表示可枚举对象的前两个元素。最后额外的.to_s是为了确保如果enumerable为空,则返回空字符串。

相关问题