36

私は最近、それがどのように機能するかについての十分な説明を見ずに、フォーマットで構成されるメソッド呼び出しを使用するコードに出くわしました。object.(arg1, arg2)このサンプル コードを参照してください。

class TestServiceObject
  def call
    'method'
  end
end

TestServiceObject.new.()
# => 'method'

この種の略記の用語は何ですか?

4

3 に答える 3

45

ドット括弧表記はcall、Ruby オブジェクトの暗黙的なメソッドに引数を渡すための簡単な方法です。

foo = lambda {|bar| puts bar}

foo.call('baz')
#=> baz
foo.('baz')

foo.call('baz') === foo.('baz')
#=> true

また、次の表記法もcallメソッドの有効な (および同等の) 呼び出しであることに注意してください。

foo['baz']
#=> baz
foo::('baz')
#=> baz

あなたの例では、呼び出されたときに文字列を返すように、クラスのメソッドを明示的にオーバーライドしています。したがって、メソッドを明示的にオーバーライドして、引数を受け入れることができます。callTestServiceObject'method'call

class TestServiceObject
  def call(foo=nil)
    foo || 'method'
  end
end

TestServiceObject.new.()
#=> method
TestServicesObject.new.('bar')
#=> bar

更新

コメンター@LoganSermancallが正式に指摘しているように、省略形の演算子は、次の例で部分的に検証されている に応答するものすべてに機能するように見えます。

m = 12.method("+")

m.call(3)
#=> 15
m.(3)
#=> 15

更新 2 :

コメンターとして@Stefanも次のドキュメントProc#callから指摘しています:

prc.() は、指定されたパラメーターで prc.call() を呼び出します。「呼び出し」を隠すのは構文シュガーです。

于 2013-10-01T05:56:00.053 に答える
4
foo.(bar, baz)

と解釈されます

foo.call(bar, baz)

と同じように

foo + bar

と解釈されます

foo.+(bar)

また

foo[bar, baz] = quux

と解釈されます

foo.[]=(bar, baz, quux)

その意図は、関数のようなオブジェクトの呼び出しをメソッドの呼び出しと同じように見せることです。

foo.(bar, baz) # function
foo(bar, baz)  # method

この質問に対する他の回答の主張にもかかわらず、それは「暗黙のcallメソッド」(Ruby には暗黙のメソッドすらなく Scala のみが存在する) やインデックス演算子とは何の関係もありません。

インデックス演算子は、への呼び出しではなく[]、別のメソッド呼び出し ( ) に変換されます。call

o = Object.new

def o.call(*args); "`call` called with #{args.join(', ')}" end

o.(42)
# => "`call` called with 42"

o[42]
# NoMethodError: undefined method `[]' for #<Object:0xdeadbeefc0ffee>

def o.[](*args);   "`[]` called with #{args.join(', ')}"   end

o[42]
# => "`[]` called with 42"
于 2013-10-01T09:53:51.303 に答える