私は最近、それがどのように機能するかについての十分な説明を見ずに、フォーマットで構成されるメソッド呼び出しを使用するコードに出くわしました。object.(arg1, arg2)
このサンプル コードを参照してください。
class TestServiceObject
def call
'method'
end
end
TestServiceObject.new.()
# => 'method'
この種の略記の用語は何ですか?
私は最近、それがどのように機能するかについての十分な説明を見ずに、フォーマットで構成されるメソッド呼び出しを使用するコードに出くわしました。object.(arg1, arg2)
このサンプル コードを参照してください。
class TestServiceObject
def call
'method'
end
end
TestServiceObject.new.()
# => 'method'
この種の略記の用語は何ですか?
ドット括弧表記は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
あなたの例では、呼び出されたときに文字列を返すように、クラスのメソッドを明示的にオーバーライドしています。したがって、メソッドを明示的にオーバーライドして、引数を受け入れることができます。call
TestServiceObject
'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() を呼び出します。「呼び出し」を隠すのは構文シュガーです。
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"