Ruby 1.9 中更自然的 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 的更“自然”的方式是什么?“自然”可能意味着更多类似计算机科学的方式。
解决方案
到目前为止,第二个选项是最常用的。
p f.call(:ruby) # => [:hello, :ruby]
它使其更类似于标准方法。此外,一些库在验证参数检查可用性时实际上依赖于鸭子类型。 #call
方法。在这种情况下,使用 #call
确保您可以提供响应的 lambda 或任何其他对象(包括类) #call
.
Rack
中间件是这种约定的一个很好的例子。基本中间件可以是 lambda,或者您可以通过使用类来提供更复杂的逻辑。
其他提示
我总是使用选项3.考虑能够在没有括号的情况下调用方法的语法模糊,这是您最接近的实际方法调用语法。
我看到了机架源代码中使用的第一种方式。它很长一段时间让我感到困惑。它从 lib / crack / 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
. 不隶属于 StackOverflow