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)
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 :
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 :
- Classe Method
- Classe UnboundMethod
0 commentaires:
Enregistrer un commentaire