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

时间:2012-10-03 11:28:50

标签: ruby lambda proc

我们知道,在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? “自然”可能意味着更多的计算机科学 - 就像这样。

3 个答案:

答案 0 :(得分:5)

第二个选项是目前使用最多的选项。

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

它使它更像标准方法。此外,在验证检查#call方法可用性的参数时,某些库实际上依赖于duck typing。在这种情况下,使用#call可确保您可以提供响应#call的lambda或任何其他对象(包括类)。

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

答案 1 :(得分:1)

我总是使用选项3.考虑到能够调用没有括号的方法的语法歧义,这是你可以获得的最接近实际的方法调用语法。

答案 2 :(得分: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