刚开始学 Ruby,找了 sinatra 源码在读(原因是觉得它比较短-,-) 在它的 module Helpers 中又一个方法,按照它的注释,大概能知道它的内容,不过没读懂其中的一句语法。
# Set or retrieve the response body. When a block is given,
# evaluation is deferred until the body is read with #each.
def body(value = nil, &block)
if block_given?
def block.each; yield(call) end
response.body = block
elsif value
headers.delete 'Content-Length' unless request.head? || value.is_a?(Rack::File) || value.is_a?(Stream)
response.body = value
else
response.body
end
end
请教其中 的 block.each 如何理解?
刚又仔细想了一下整理下现在的思路是:
1.是不是给 block 这个 Proc 中定义一个叫 each 的方法? 2.如果 1 成立,那么方法中的 yield(call) 代表着需要向 each 这个方法传入一个 block 而且在调用这个 block 的时候有 call?
再继续看代码。。