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

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)

Urs*_*sus 6

这似乎有效

{
  foo: 123,
  bar: <<-HEREDOC,
    a longer text
  HEREDOC
  baz: 456
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*fan 5

乌萨斯的回答很正确。这样做的原因是这里文档不会在开始标识符之后立即开始,而是在开始标识符后面的行上开始。开始标识符之后的所有内容(在同一行)都会像往常一样进行解析。

这不仅允许您将,右侧放在 后面<<-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 没有正确理解,因此它们经常被忽视:

要调用定界文档上的方法,请将其放在开始标识符之后:

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
Run Code Online (Sandbox Code Playgroud)