在this页面底部进行练习时
我帮助你找到了下面的解决方案:
虽然是第4行,但仍然让我烦恼的是。block.call
在puts
开始写入屏幕之前似乎完整地运行了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}}
答案 0 :(得分:0)
让我们考虑以下示例:
greeting = "Howdy!"
puts "#{greeting} What's up?"
这里是在一个字符串中插入greeting
变量,该字符串传递给Ruby的Kernel#puts
方法。所以greeting
需要在插入之前先定义和评估(或者进行任何其他操作,如连接等)。
你明白了吗?
现在让我们看看你的例子:
puts "... #{desc} finished, returning: #{block.call}"
在这里,desc
和block.call
需要首先解释,然后才能在字符串中进行插值。
如何将此行为与其他语言进行比较:http://en.wikipedia.org/wiki/String_interpolation