5

ご存知のように、Ruby1.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

2番目のオプションは、これまでで最もよく使用されています。

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

これにより、標準的な方法により類似したものになります。また、一部のライブラリは、メソッドの可用性をチェックする引数を検証するときに、実際にはダックタイピングに依存しています#call。この場合、を使用#callすると、に応答するラムダまたはその他のオブジェクト(クラスを含む)を確実に提供できます#call

Rackミドルウェアは、この規則の良い例です。基本的なミドルウェアはラムダにすることも、クラスを使用してより複雑なロジックを提供することもできます。

于 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 に答える