簡體   English   中英

更自然的方式在Ruby 1.9中調用Proc

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM