12

次のモジュールがあるとします。

module Foo
  def self.call
    'foo'
  end
end

もちろん、次のことが機能することを期待しています。

puts Foo.call  # outputs "foo"

ただし、これが機能するとは思っていませんでした。

puts Foo.()    # outputs "foo"

どうやらメソッド名が省略されていると、Ruby は私がそのcallメソッドを呼び出したいと思っているようです。これはどこに文書化されており、なぜそのように動作するのですか?

4

2 に答える 2

11

Proc#call:

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

私はいくつかの調査を行い、メソッド#()がメソッドの構文糖衣であることが#callわかりました..以下のエラーを見てください:

module Foo
  def self.bar
    12
  end
end
Foo.()
#undefined method `call' for Foo:Module (NoMethodError)

OP#callがモジュールFooクラスでメソッドを定義したようFoo#callに、 の試みで呼び出されFoo.()ます。

いくつかの例を次に示します。

"ab".method(:size).() # => 2
"ab".method(:size).call # => 2
"ab".() # undefined method `call' for "ab":String (NoMethodError)

ここでMatzの発言を参照してください。1.9で導入された object.() 構文で妥協してください...

于 2013-10-04T20:07:17.450 に答える