4

私はこのラムダを持っています(またはクロージャーは正しい使い方ですか?)そして私はの使い方を理解しています.call

def multi(m)
  lambda { |n| n * m }
end

two = multi(2)
two.call(10) #=> 20  #call the proc

しかし、なぜ/どのようにこれが機能するのかを理解しようとしていますか?

two.(20) #=> 40 
two[20] #=> 40

それが機能するべきかどうかはわかりません。ほとんどの場合、私は配列で角括弧を使用してきました。

4

2 に答える 2

4

ドキュメント

prc[params,...] → obj

ブロックを呼び出し、セマンティクスを呼び出すメソッドに近いものを使用して、ブロックのパラメーターを params の値に設定します。複数の値が 1 つのみを予期する proc に渡されると、警告が生成されます (以前は、これは暗黙のうちにパラメーターを配列に変換していました)。prc.() は、与えられたパラメータで prc.call() を呼び出すことに注意してください。「呼び出し」を隠すのは構文シュガーです。

lambda または ->() を使用して作成された proc の場合、間違った数のパラメーターが複数のパラメーターを持つ Proc に渡されると、エラーが生成されます。Proc.new または Kernel.proc を使用して作成された proc の場合、余分なパラメーターは黙って破棄されます。

于 2013-09-12T20:58:18.677 に答える
3

最初の質問はハックです。Ruby ではオブジェクトproc.()を定義できないからです。()の構文糖衣ですproc.call()

2 番目の質問では、 a で角括弧を使用すると it がProc呼び出されます。

于 2013-09-12T20:59:10.593 に答える