Более естественный способ вызова Proc в Ruby 1.9.

StackOverflow https://stackoverflow.com//questions/12707559

  •  13-12-2019
  •  | 
  •  

Вопрос

Как мы знаем, в 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. Учитывая синтаксические неоднозначные возможности возможности вызывать методы без скобок, это самый близкий, который вы можете добраться до фактического синтаксиса вызова метода.

Я видел первый способ, используемый в SHICE исходный код.Это путало меня за долгое время.Он выбран из 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 с атрибуция
Не связан с StackOverflow
scroll top