Ste*_*fan 3 ruby hashmap heredoc literals
我只想使用heredoc作为哈希文字中的值.如果heredoc是最后一个元素,它可以正常工作:
{
foo: 123,
bar: <<-HEREDOC
a longer text
HEREDOC
}
#=> {:foo=>123, :bar=>" a longer text\n"}
Run Code Online (Sandbox Code Playgroud)
我找不到在heredoc 之后添加另一个键值对的方法.或者,更具体地说,我找不到一种方法来插入分隔逗号而不会导致语法错误:
{
foo: 123,
bar: <<-HEREDOC
a longer text
HEREDOC
# <- causes a syntax error because a comma is missing here, but where to put it?
baz: 456
}
Run Code Online (Sandbox Code Playgroud)
这似乎有效
{
foo: 123,
bar: <<-HEREDOC,
a longer text
HEREDOC
baz: 456
}
Run Code Online (Sandbox Code Playgroud)
乌萨斯的回答很正确。这样做的原因是这里文档不会在开始标识符之后立即开始,而是在开始标识符后面的行上开始。开始标识符之后的所有内容(在同一行)都会像往常一样进行解析。
这不仅允许您将,右侧放在 后面<<-HEREDOC,还允许您在一行中定义整个哈希:
{ foo: 123, bar: <<-HEREDOC, baz: 456 }
a longer text
HEREDOC
#=> {:foo=>123, :bar=>" a longer text\n", :baz=>456}
Run Code Online (Sandbox Code Playgroud)
您还可以传递两个heredocs:(使用~而不是-删除空格)
{ foo: 123, bar: <<~BAR, baz: <<~BAZ }
bar's value
BAR
baz's value
BAZ
#=> {:foo=>123, :bar=>"bar's value\n", :baz=>"baz's value\n"}
Run Code Online (Sandbox Code Playgroud)
Ruby 的heredoc 文档包含类似的示例,但不幸的是 RDoc 没有正确理解,因此它们经常被忽视:
要调用定界文档上的方法,请将其放在开始标识符之后:
Run Code Online (Sandbox Code Playgroud)expected_result = <<-EXPECTED.chomp One plus one is #{1 + 1} EXPECTED您可以在同一行上打开多个此处文档,但这可能很难阅读:
Run Code Online (Sandbox Code Playgroud)puts(<<-ONE, <<-TWO) content for heredoc one ONE content for heredoc two TWO