为什么不在here-doc工作中阻止参数?

Dou*_*len 3 ruby

我试图弄清楚为什么以下代码在here-doc字符串eval中不起作用:

script = <<FILE

def i_feel(&block)
  block_given? ? "I feel #{ yield } :D" : "I don't know how I feel :/" 
end

i_feel                                  
# => "I don't know how I feel :/"

i_feel { 'great' }                   
# => "I feel great :D"
FILE

puts script

`<main>': no block given (yield) (LocalJumpError)
Run Code Online (Sandbox Code Playgroud)

我知道部分原因是字符串插值.但是我如何让它发挥作用?首先尝试没有here-doc,看看它是否有效?

mat*_*att 7

您可以通过使用以下标识符包围标识符来避免在heredoc中进行插值':

script = <<'FILE'
something with #{interpolation} like syntax.
FILE

puts script
Run Code Online (Sandbox Code Playgroud)

这将只打印出文字something with #{interpolation} like syntax.没有'围绕FILE你可能会得到一个错误(如果interpolation定义你不会).

您还可以使用`(反引号)来执行heredoc的内容:

s = <<`SCRIPT`
echo foo
echo bar
SCRIPT
Run Code Online (Sandbox Code Playgroud)

s现在将包含执行heredoc的结果 - 在本例中为字符串"foo\nbar\n".