我正在试图找出为什么以下代码在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)我知道部分原因是字符串插值。但我该怎么做呢?先试一试,不需要这里-看看它是否有效?
发布于 2013-09-02 03:38:57
这是我的答案,更多关于我的目的是什么。你想看看你刚刚运行的是什么,所以这是完整的版本。
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维克多说得对。这里,医生也包括范围。在这种情况下,它是插值的插值。听起来有点让人困惑,但看看这些括号到了什么程度。还请注意,我们必须转义原始#{ less }less,它尝试计算它。这就是首先引起所有麻烦的原因。希望这能有所帮助。
顺便说一句,这是从lambdas.rb复制过来的
由此可以看出,您不需要&block参数。
发布于 2013-09-01 01:41:05
您可以使用'包围标识符,从而避免在本地文档中进行内插。
script = <<'FILE'
something with #{interpolation} like syntax.
FILE
puts script这将只打印出文字something with #{interpolation} like syntax.,而不需要FILE周围的',您可能会得到一个错误(如果定义了interpolation,就不会)。
您还可以使用` (backticks)来执行本文档的内容:
s = <<`SCRIPT`
echo foo
echo bar
SCRIPTs现在将包含执行此文件的结果--在本例中是字符串"foo\nbar\n"。
发布于 2013-09-01 01:27:41
我想我刚弄明白了。
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只需删除字符串内插括号,在这里文档打印它,没有它们很好。我想我忘了把它设为内插。糟了!我会在可能的时候再给你们回电。
也许现在我可以从中得到一些新的东西。至少错误消失了。这样我就不会分心了。
https://stackoverflow.com/questions/18554285
复制相似问题