lundi 18 février 2008

MetaTricks : référence à une méthode

En Ruby, tout ou presque est objet. Les méthodes sont des objets comme les autres, sauf qu'il n'est pas forcément évident au premier abord d'y avoir accès. Pour cela, on utilise des références, manipulées comme dans le code suivant.

Code :
(Testé sous Windows XP ; Ruby 1.8.6)



class Canard
def initialize name
@nom = name
end

def coin
"Coin coin, I'm #{@nom} !"
end

def Canard.coin2
"Can Can !"
end
end

toto = Canard.new "Dude"

# L'accès à une méthode se fait via +method+
#prenant en argument la référence de la méthode
#(son nom sous forme de string ou de symbol).
hello = toto.method(:coin)
puts hello.call

#(bonus -> arity donne le nombre d'arguments d'une méthode)
puts "To create a new *Canard* needs " \
+ (toto.method(:initialize).arity).to_s \
+ " argument(s)."

# Une liste de références à des méthodes de +Canard+
meths = [:to_s, :to_something_else, :coin, "to_yaml"]

# L'accès se fait ensuite ici encore via +method+
#et l'appel via +call+
meths.each do |meth|
begin
puts "-----------------"
puts "Method #{meth}"
puts (toto.method(meth).call).to_s
rescue
puts "Problem with this method."
next
end
end


Note :

Les manipulations possibles sur les méthodes sont peu nombreuses, mais assez puissantes. Ici on a vu call et arity : unbind permet elle de "dissocier" la méthode référencée de son receveur (ce qui donne un objet de la classe UnboundMethod...)

Documentation :

0 commentaires: