如何在Ruby中的散列文字中将heredoc与其他键值对分开?

时间:2016-10-29 15:04:08

标签: ruby hashmap literals heredoc

我只想使用heredoc作为哈希文字中的值。如果heredoc是最后一个元素,它可以正常工作:

{
  foo: 123,
  bar: <<-HEREDOC
    a longer text
  HEREDOC
}
#=> {:foo=>123, :bar=>"    a longer text\n"}

我找不到在 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
}

2 个答案:

答案 0 :(得分:5)

这似乎有效

{
  foo: 123,
  bar: <<-HEREDOC,
    a longer text
  HEREDOC
  baz: 456
}

答案 1 :(得分:1)

Ursus' answer现场点亮。 为什么这个有效的原因是heredoc不会在开始标识符之后立即开始,而是在跟随开头标识符的行上。开头标识符(在同一行)之后的所有内容都照常解析。

这不仅允许您将{ foo: 123, bar: <<-HEREDOC, baz: 456 } a longer text HEREDOC #=> {:foo=>123, :bar=>" a longer text\n", :baz=>456} 放在~之后,它还允许您在一行中定义整个哈希:

-

您还可以传递两个heredoc :(使用{ 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"} 代替expected_result = <<-EXPECTED.chomp One plus one is #{1 + 1} EXPECTED 条纹空格)

 puts(<<-ONE, <<-TWO)
 content for heredoc one
 ONE
 content for
 heredoc two
 TWO

Ruby的heredoc documentation包含类似的例子,但不幸的是RDoc并没有把它弄好,所以它们经常被忽视:

  

要在heredoc上调用方法,请将其放在开头标识符之后:

{{1}}
     

您可以在同一行上打开多个heredoc,但这可以   难以理解:

{{1}}