2010-04-20 4 views

Répondre

25

Vous devez saisir la méthode en utilisant method avec le nom de la méthode comme argument. Cela vous renverra une instance de type Method, qui peut être appelée avec 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() 

Notez que les arguments devront être ajoutés à la méthode call.


Dans beaucoup de cas pratiques, cependant, il n'est pas nécessaire d'enregistrer la méthode elle-même dans une variable dans Ruby; Si vous voulez simplement appeler dynamiquement une méthode (c'est-à-dire envoyer un message à un objet) et qu'il n'est pas nécessaire de sauvegarder la méthode, vous pouvez également utiliser la méthode (ou __send__ en cas de conflits de noms).

x = MyClass.new 
puts x.send :myMethod # also possible with a string: m.send "myMethod" 
# "Hi" 

Tous les arguments doivent suivre le nom de la méthode:

puts x.send(:myMethod, arg1, arg2) 

Pour l'utiliser comme ceci est probablement plus Ruby-like, comme le concept de classes méthode est pas aussi important car il est en Python. En Python, vous pouvez toujours penser à un mécanisme en deux étapes lorsque vous faites quelque chose comme a_string.split(); d'abord vous prenez la méthode avec a_string.split et ensuite vous l'appelez (soit implicitement avec () ou explicitement avec __call__()). Donc, couper ce mécanisme en deux étapes est plutôt naturel à faire. Ruby est plus basé sur le passage de messages et pour obtenir réellement une classe de méthode dans Ruby, vous devrez faire un peu plus de travail, car d'une certaine façon, l'objet de la méthode devra être construit pour vous à ce point. Donc, sauf si vous avez vraiment besoin d'un objet Méthodes dans Ruby, vous devriez plutôt vous en tenir à l'abstraction de passage de message et simplement utiliser send.

+0

Bonne réponse. Mais ne devrait-il pas être «x.send» plutôt que «m.send»? – FMc

+0

Oui, vous avez raison. 'm' ne serait même pas défini dans ce scénario. – Debilski

+0

Notez que 'method()' retournera un nouvel objet avec chaque invocation - pas quelque chose d'important la plupart du temps, mais parfois un gotcha par exemple. dans les tests. –

4

Je pense que vous cherchez bloc Proc ou lambda

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

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

je lirais ce court message - il y a une différence légère mais significative de la façon dont les méthodes se comportent http://samdanielson.com/2007/3/19/proc-new-vs-lambda-in-ruby

+0

Non, pas vraiment, c'est ce que j'ai trouvé dans la plupart des sites sur le web, mais pas vraiment ce que je cherchais, merci quand même. – OscarRyz

+0

Façon fonctionnelle de faire les choses! Je préfère cette réponse – metrix

Questions connexes