Necesita agarrar el método usando method
con el nombre del método como argumento. Esto le devolverá una instancia de tipo Method
, que se puede llamar con call()
.
class MyClass
def myMethod
"Hi"
end
end
x = MyClass.new
m = x.method(:myMethod)
# => #<Method: MyClass#myMethod>
puts m.call
# You can also do m[] instead of m.call()
Tenga en cuenta que tendrían que ser añadido al método call
ningún argumento.
En muchos casos prácticos, sin embargo, no hay necesidad de guardar el método en una variable en Ruby; si solo desea llamar dinámicamente un método (es decir, enviar un mensaje a un objeto) y no es necesario guardar el método, también puede usar el método send
(o __send__
en caso de conflictos de nombres).
x = MyClass.new
puts x.send :myMethod # also possible with a string: m.send "myMethod"
# "Hi"
Todos los argumentos deben seguir el nombre del método:
puts x.send(:myMethod, arg1, arg2)
para usarlo como este es probablemente más Rubí-como, como el concepto de clases método no es tan importante como lo es en Python. En Python, siempre se puede pensar en un mecanismo de dos pasos cuando se hace algo como a_string.split()
; primero agarra el método con a_string.split
y luego lo llama (ya sea implícitamente con ()
o explícitamente con __call__()
). Entonces, cortar ese mecanismo de dos pasos es bastante natural de hacer.
Ruby se basa más en la transmisión de mensajes y para obtener una clase de método en Ruby, tendrás que trabajar un poco más, porque de alguna manera, el objeto de método tendrá que construirse para ti en ese momento. Entonces, a menos que realmente necesites algún objeto de Métodos en Ruby, deberías apegarte al mensaje que pasa abstracción y simplemente usar send
.
Buena respuesta. ¿Pero no debería ser 'x.send' en lugar de' m.send'? – FMc
Sí, estás en lo correcto. 'm' ni siquiera se definiría en ese escenario. – Debilski
Tenga en cuenta que 'method()' devolverá un nuevo objeto con cada invocación, no es algo importante la mayor parte del tiempo, pero a veces es un getcha, p. en pruebas. –