[英]More natural way of Proc calling in Ruby 1.9
我們知道,在Ruby 1.9中有幾種Proc調用方式
f =->n {[:hello, n]}
p f[:ruby] # => [:hello, :ruby]
p f.call(:ruby) # => [:hello, :ruby]
p f.(:ruby) # => [:hello, :ruby]
p f === :ruby # => [:hello, :ruby]
我很好奇,什么是更自然的方式調用Proc? “自然”可能意味着更多的計算機科學 - 就像這樣。
第二種選擇是目前使用最多的選項。
p f.call(:ruby) # => [:hello, :ruby]
它使它更類似於標准方法。 此外,在驗證檢查#call
方法可用性的參數時,某些庫實際上依賴於duck typing。 在這種情況下,使用#call
可確保您可以提供響應#call
的lambda或任何其他對象(包括Class)。
Rack
中間件就是這種慣例的一個很好的例子。 基本中間件可以是lambda,也可以通過使用類來提供更復雜的邏輯。
我總是使用選項3.考慮到能夠調用沒有括號的方法的語法歧義,這是最接近實際方法調用語法的方法。
我看到了Rack源代碼中使用的第一種方式。 它在很長一段時間里困擾着我。 它來自lib / rack / builder.rb ( 版本:1.6.0.alpha )
module Rack
class Builder
...
def to_app
app = @map ? generate_map(@run, @map) : @run
fail "missing run or map statement" unless app
# This is the first option calling a proc
# @use is a array of procs (rack middleware)
@use.reverse.inject(app) { |a,e| e[a] }
end
...
end
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.