如何迭代地将数组的元素插入 Ruby 中的字符串?

How to iteratively interpolate elements of an array into a string in Ruby?

我正在尝试做这样的事情:

my_array = [1,2,3]
puts "Count numbers" + my_array.each {|n| " #{n}"}

我想看的是“数数 1 2 3”。但是因为 .each returns 数组,而不是块中返回的内容,所以这是不可能的。如何遍历数组并将每个元素一个一个地插入到一个字符串中?我现在不担心格式化白色 space 或换行符。然而,这将在错误记录的上下文中使用,我只想给我的记录器一个字符串来打印,所以我不能单独打印每个元素。

这是 Ruby 的 mapjoin 函数的完美案例:

puts "Count numbers " + my_array.map{|n| n.to_s}.join(" ")

map 函数将数组中的每个元素映射到其字符串表示形式,join 将它们连接在一起,以空格分隔。

编辑:在这种特定情况下,可以省略 map 部分,其中元素直接转换为字符串。 join 无论如何都会将每个元素转换为字符串,因此 my_array.join(" ") 足以解决这种情况。

视情况而定,可能根本没有理由通过障碍。对于给出的示例,您可以像这样简单地使用 join 方法:

puts "Count numbers " + my_array.join(" ")
#=>  "Count numbers 1 2 3"

...或者,有趣的是,您也可以使用 * 运算符来做几乎相同的事情:

puts "Count numbers " + my_array*(" ")
#=>  "Count numbers 1 2 3"

注意:我包含 * 运算符选项主要是作为一个奇怪的选择。我不确定它是否真的比 join 方法有任何好处,除非您可能试图让您的代码尽可能神秘。你永远不知道。很高兴知道有哪些方法可用。

只是根据您最初尝试的解决方案更具体地给您另一个答案:

my_array = [1,2,3]
my_string = "Count numbers"
my_array.each {|n| my_string << " #{n}"}

puts my_string
#=>  "Count numbers 1 2 3"

主要区别在于我们首先为所需的输出字符串创建一个容器,然后在 each 块内连接到该字符串。