3

我试图弄清楚为什么以下代码在 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)

我知道部分原因是字符串插值。但是我该如何让它工作呢?先在没有 here-doc 的情况下尝试一下,看看它是否有效?

4

3 回答 3

7

您可以通过将标识符括在以下位置来避免在heredoc中进行插值'

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

puts script

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

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

s = <<`SCRIPT`
echo foo
echo bar
SCRIPT

s现在将包含执行 heredoc 的结果——在本例中为 string "foo\nbar\n"

于 2013-09-01T01:41:05.613 回答
1

我想我只是想通了。

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

只需删除字符串插值括号,这里的文档就可以在没有它们的情况下打印它。我想我忘记了将其设置为插值。哎呀!我会尽快回复大家。

也许现在我可以从中得到一些新的东西。至少错误消失了。这将不再让我分心。

于 2013-09-01T01:27:41.763 回答
0

这是答案以及更多关于我的预期目的的信息。您想查看刚刚运行的内容,因此这是完整版本。

script = <<FILE

def how_i_feel
  block_given? ? "I feel \#{ yield }." : "I don't know how I feel :/." 
end
#{ def how_i_feel
     block_given? ? "I feel #{ yield }." : "I don't know how I feel :/." 
   end }
how_i_feel
#{ how_i_feel }                                  

how_i_feel { 'great :D' }
#{ how_i_feel { 'great :D' } }    

FILE

puts script

维克多说的是对的。这里的文档也包括范围。在这种情况下,它是插值的插值。听起来有点令人困惑,但只要看看这些括号达到什么水平。还要注意,我们必须避开原始的 #{ yield } ,而不是尝试评估它。这就是最初造成所有麻烦的原因。希望这可以帮助。

顺便说一句,这只是从https://github.com/JoshCheek/ruby-kickstart/blob/kevin_challenge/cheatsheets/blocks_procs_and_lambdas.rb复制的

从那里你可以看到你不需要 &block 参数。

于 2013-09-02T03:38:57.473 回答