2010-04-20 21 views

Respuesta

25

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.

+0

Buena respuesta. ¿Pero no debería ser 'x.send' en lugar de' m.send'? – FMc

+0

Sí, estás en lo correcto. 'm' ni siquiera se definiría en ese escenario. – Debilski

+0

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. –

4

creo que busca el bloque Proc o lambda

x = Proc.new { return "Hello World" } 
puts x.call 

x = lambda { return "Hello World" } 
puts x.call 

Me gustaría leer este breve post - hay una diferencia leve pero significativo en la forma en que los métodos se comportan http://samdanielson.com/2007/3/19/proc-new-vs-lambda-in-ruby

+0

No, no realmente, eso es lo que encontré en la mayoría de los sitios en la web, pero no es lo que estaba buscando, gracias de todos modos. – OscarRyz

+0

¡Forma funcional de hacer las cosas! Prefiero esta respuesta – metrix

Cuestiones relacionadas