ternario operator operador ruby methods syntax service-object

operator - operador ternario ruby



¿Cómo funciona el operador.() De Ruby? (3)

Hace poco encontré un código usando una llamada a método que consiste en el object.(arg1, arg2) formato object.(arg1, arg2) sin ver una buena explicación de cómo funciona. Vea este código de muestra:

class TestServiceObject def call ''method'' end end TestServiceObject.new.() # => ''method''

¿Cuál es el término para este tipo de taquigrafía?


La notación punto-paréntesis es una forma abreviada de pasar argumentos al método de call implícita en un objeto Ruby:

foo = lambda {|bar| puts bar} foo.call(''baz'') #=> baz foo.(''baz'') foo.call(''baz'') === foo.(''baz'') #=> true

También tenga en cuenta que las siguientes notaciones también son válidas (y equivalentes) invocaciones del método de call :

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

En su ejemplo, está anulando explícitamente el método de call en la clase TestServiceObject modo que devuelva la cadena ''method'' cuando se TestServiceObject . En consecuencia, puede anular explícitamente el método de call para aceptar argumentos:

class TestServiceObject def call(foo=nil) foo || ''method'' end end TestServiceObject.new.() #=> method TestServicesObject.new.(''bar'') #=> bar

ACTUALIZAR :

Tal @LoganSerman señala el comentarista @LoganSerman , el operador de taquigrafía parece trabajar en cualquier cosa que responda a la call , lo que se valida en parte con el siguiente ejemplo:

m = 12.method("+") m.call(3) #=> 15 m.(3) #=> 15

ACTUALIZACIÓN 2 :

Como comenta el comentarista @Stefan también de la documentación en Proc#call :

prc. () invoca prc.call () con los parámetros dados. Es un azúcar de sintaxis para ocultar "llamada".


obj.(args) es solo una característica proporcionada a través del analizador. No es técnicamente un alias, pero simplemente tiene el mismo efecto que invocar obj.call(args) en un objeto que define el método de call .


foo.(bar, baz)

se interpreta como

foo.call(bar, baz)

al igual que

foo + bar

se interpreta como

foo.+(bar)

o

foo[bar, baz] = quux

se interpreta como

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

La intención es hacer que los objetos similares a funciones de llamada se vean similares a los métodos de llamada:

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

A pesar de las afirmaciones en otras respuestas a esta pregunta, no tiene nada que ver con un "método de call implícita" (Ruby ni siquiera tiene métodos implícitos, solo Scala lo hace) o el operador de indexación.

El operador de indexación se traduce en una llamada a método diferente ( [] ) y no en una llamada a 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"