我在railscasts上看到了以下代码:
def each(&block)
block.call("<!-- #{@message}: #{@stop - @start} -->\n") if @headers["Content-Type"].include? "text/html"
@response.each(&block)
end
我想知道&amp; block来自哪里?这里发生了什么?
答案 0 :(得分:1)
&block
是在Ruby中定义接受方法并将块显式分配给&
引用的变量的方法的方法。
具体来说,该代码的作用是什么,它接受一个块,调用块传递一个字符串作为参数,然后将该块传递给内部响应。
乍一看,我会说你看到的特定中间件基本上是注入字符串
"<!-- #{@message}: #{@stop - @start} -->\n"
如果请求内容类型为"text/html"
,则进入HTTP响应正文,这意味着HTTP页面。
如果请求是针对HTTP页面的,则会提供响应,并且会注入该字符串。否则,如果请求是针对另一种文件(例如二进制文件,文本文件,javascript等),则无需任何修改即可提供响应。
以下示例将帮助您更多地了解&block
def foo(&block)
puts "foo"
bar(&block)
end
def bar(&block)
puts "bar"
block.call
end
foo do
puts "block"
end
# => foo
# => bar
# => block
另请注意,保存块的变量可以命名为任何内容,而不是block
def foo(&my_block)
puts "foo"
bar(&my_block)
end
def bar(&another_block)
puts "bar"
another_block.call
end
foo do
puts "block"
end
# => foo
# => bar
# => block
答案 1 :(得分:0)
在给定的示例中each
被定义为使中间件表现为有效的 rack 响应主体(我真的不建议这样做)。
Rack希望响应主体是一个类的实例,它将each
定义为公共方法(数组或甚至 ActionController :: Response 实例)。
之后的任何中间件都可以使用each
来操作响应主体。在中间件链末端机架本身将使用它来处理和发送最终响应。