5

我们知道,在 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 的更“自然”方式是什么?“自然”可能意味着更多的计算机科学——类似的方式。

4

3 回答 3

5

第二种选择是迄今为止最常用的。

p f.call(:ruby)  # => [:hello, :ruby]

它使它更类似于标准方法。此外,一些库在验证参数检查方法的可用性时实际上依赖于鸭子类型#call。在这种情况下, using#call确保您可以提供一个 lambda 或任何其他响应#call.

Rack中间件就是这种约定的一个很好的例子。基本中间件可以是 lambda,或者您可以使用类提供更复杂的逻辑。

于 2012-10-03T11:54:58.180 回答
1

我总是使用选项 3。考虑到能够在没有括号的情况下调用方法的语法歧义,这是最接近实际方法调用语法的方法。

于 2012-10-03T11:49:01.323 回答
0

我看到了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
于 2013-04-17T15:10:43.273 回答