2009-12-14 9 views
1

Salut je veux faire ce qui suit. Je veux simplement surcharger la méthode [] pour accéder aux variables d'instance ... Je sais, ça n'a pas beaucoup de sens, mais je veux le faire pour une raison étrange: PAccéder aux variables en utilisant les parenthèses de surcharge [] dans Ruby

être quelque chose comme ça ...

class Wata 

    attr_accessor :nombre, :edad 

    def initialize(n,e) 
     @nombre = n 
     @edad = e 
    end 

    def [](iv) 
     self.iv 
    end 

end 

juan = Wata.new('juan',123) 

puts juan['nombre'] 

Mais jeter l'erreur suivante:

overload.rb: 11: `[] ': méthode non définie 'iv' pour # (NoMethodError)

Comment puis-je faire cela?

EDIT

J'ai trouvé aussi cette solution:

def [](iv) 
    eval("self."+iv) 
end 

Répondre

8

Variables et messages vivent dans un autre espace de noms. Pour envoyer la variable comme un message, vous auriez besoin de le définir comme soit:

def [](iv) 
    send iv 
end 

(si vous voulez l'obtenir par un accesseur)

ou

def [](iv) 
    instance_variable_get "@#{iv}" 
end 

(si vous voulez accéder à l'ivar directement)

+0

Excellent Chuck! Merci – flyer88

+0

Envoyer fonctionne avec des méthodes seulement, attr_accessor ajoute à la fois les méthodes setter et getter pour vous, donc l'envoi appelle fondamentalement le getter. – khelll