我想从这里的文档(heredoc)中调用一个块,但我似乎无法让它工作。我是否误解了语法,或者这不可能(使用Ruby 1.9.3)?
以下示例代码说明了我要做的事情。
colors = { "red" => "#FF0000",
"orange" => "#FF7F00",
"yellow" => "#FFFF00",
"green" => "#00FF00",
"blue" => "#0000FF",
"indigo" => "#4B0082",
"violet" => "#8F00FF" }
puts
puts <<COLORS
--------------------------------------------------------------------------------
The colors of the rainbow:
#{ colors.each { |key, value| puts "#{key} (#{value})" } }
--------------------------------------------------------------------------------
COLORS
这会在我的系统上产生以下输出。
red (#FF0000)
orange (#FF7F00)
yellow (#FFFF00)
green (#00FF00)
blue (#0000FF)
indigo (#4B0082)
violet (#8F00FF)
--------------------------------------------------------------------------------
The colors of the rainbow:
{"red"=>"#FF0000", "orange"=>"#FF7F00", "yellow"=>"#FFFF00", "green"=>"#00FF00", "blue"=>"#0000FF", "indigo"=>"#4B0082", "violet"=>"#8F00FF"}
--------------------------------------------------------------------------------
但是,我期待以下内容。
--------------------------------------------------------------------------------
The colors of the rainbow:
red (#FF0000)
orange (#FF7F00)
yellow (#FFFF00)
green (#00FF00)
blue (#0000FF)
indigo (#4B0082)
violet (#8F00FF)
--------------------------------------------------------------------------------
答案 0 :(得分:3)
字符串插值只计算#{ }
中的表达式并在返回值上调用to_s
并将前缀,返回的字符串和后缀连接在一起以形成新字符串。
您编写调用each
,它将返回原始哈希,因此您会看到哈希的to_s
返回值在输出中。并且在HEREDOC参数传递给puts <<COLORS
之前评估附加到每个块的块,因此块中puts "#{...}"
的输出出现在所需输出之前。
您需要返回字符串的必需部分。因此,您必须对原始哈希进行一些转换,然后将这些部分与"\n"
连接在一起,以形成所需输出的“颜色”部分。
puts <<COLORS
--------------------------------------------------------------------------------
The colors of the rainbow:
#{ colors.map { |key, value| "#{key} (#{value})" }.join("\n") }
--------------------------------------------------------------------------------
COLORS
我会将变换和连接结果存储在puts
之前的变量中,并使用字符串插值来引用该变量。我认为最好在#{ }
中保持简单。