调用一个块,执行超出预期顺序的事情

时间:2013-10-28 06:26:24

标签: ruby

this页面底部进行练习时

我帮助你找到了下面的解决方案:

虽然是第4行,但仍然让我烦恼的是。block.callputs开始写入屏幕之前似乎完整地运行了def log(desc, &block) puts "Beginning #{desc}..." #block.call seems to be occurring here! puts "... #{desc} finished, returning: #{block.call}" end someLittle = lambda {5} yetAnother = lambda {'I like Thai food!'} outer = lambda do log "some little block", &someLittle log "yet another block", &yetAnother false end log "outer block", &outer

这只是接受Ruby的东西吗?如果我试着查看它,我甚至会称这种行为为什么?

{{1}}

1 个答案:

答案 0 :(得分:0)

让我们考虑以下示例:

greeting = "Howdy!"
puts "#{greeting} What's up?"

这里是在一个字符串中插入greeting变量,该字符串传递给Ruby的Kernel#puts方法。所以greeting需要在插入之前先定义和评估(或者进行任何其他操作,如连接等)。

你明白了吗?

现在让我们看看你的例子:

puts "... #{desc} finished, returning: #{block.call}"

在这里,descblock.call需要首先解释,然后才能在字符串中进行插值。

如何将此行为与其他语言进行比较:http://en.wikipedia.org/wiki/String_interpolation