Более естественный способ вызова Proc в 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
метод.В этом случае, используя #call
гарантирует, что вы можете предоставить лямбду или любой другой объект (включая класс), который реагирует на #call
.
Rack
промежуточное программное обеспечение является отличным примером этого соглашения.Базовым промежуточным программным обеспечением может быть лямбда-выражение, или вы можете предоставить более сложную логику, используя классы.
Другие советы
Я всегда использую вариант 3. Учитывая синтаксические неоднозначные возможности возможности вызывать методы без скобок, это самый близкий, который вы можете добраться до фактического синтаксиса вызова метода.
Я видел первый способ, используемый в
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
.