在字符串中枚举

时间:2017-01-25 01:27:27

标签: ruby string enumeration string-interpolation

我试图在字符串中枚举数组,并在字符串内插入数组的值。

示例:

todos = ["sleep", "eat", "powernap"]

"Today I have todo: \n" +
'#{todos.each do |todo| }'
"\t #{todo}" +
'#{end}'

输出:

"Today I have todo: \n\tsleep\neat\npowernap"

2 个答案:

答案 0 :(得分:3)

您希望#{...}像ERB的<%...%>甚至PHP的<?php一样工作,但事实并非如此。字符串插值必须包含完整的,语法上有效的Ruby表达式,并且该位代码不完整。

你可以重做那个单数表达式:

"Today I have todo: #{todos.join("\t "}"

或者您可以手动进行迭代,但这在性能方面通常不是最佳的:

todos.each_with_object("Today I have todo:") do |todo, buffer|
  buffer << "\t " << todo
end

正如您所看到的,第一个版本更加简洁。

Ruby的字符串插值选项非常灵活,但它们确实要求代码是自包含的。

答案 1 :(得分:0)

我认为你想要这个:

Today I have todo:
        sleep
        eat
        powernap

为此,您可以使用map将每个元素包装在制表符和换行符中,然后join将数组中的字符串转换为单个字符串。

todos.map {|todo| "\t#{todo}\n"}.join("")

这将在每个元素周围添加换行符和制表符,然后将每个元素连接在一起。请注意,它使用#{}在字符串中嵌入变量来使用连接。它也可能是"\t" + todo + "\n",这是完全相同的。

结果是:

"\tsleep\n\teat\n\tpowernap\n"

然后你可以用字符串连接它,不需要任何特殊的东西。

puts "Today I have todo:\n" +
     todos.map {|todo| "\t#{todo}\n"}.join("") +
     "I hope I get them done!\n"

有很多方法可以做到这一点,但重要的是它必须生成一个String。 each无法工作,因为它会产生一个数组,你会得到这样的结果:

Today I have todo:
    ["sleep", "eat", "powernap"]
I hope I get them done!

如果您愿意,可以将整个表达式放入字符串中的#{},以此作为字符串插值。这是一个更简单的示例,可以将列表转换为以逗号分隔的字符串。

puts "Today I have todo: #{todos.join(", ")}\n"

任何表达式都可以进入#{},但#{}必须包含完整的表达式!每个#{}将自行运行,每个结果将连接到字符串中。

相关问题