2009-02-23 1 views
4

J'essaie d'obtenir l'appel de l'un de mes rédacteurs d'attributs de classe, mais pour une raison inconnue, il n'est jamais appelé. Voici un code qui clarifiera ceci:Appel des méthodes d'accès aux attributs à partir de la classe

class Test 
    attr_reader :test 

    def test=(val) 
    puts 'Called' 
    @test = val 
    end 

    def set_it(val) 
    test = val 
    end 
end 

obj = Test.new 
obj.set_it 5 
puts obj.test 
=> nil 

L'instruction puts à la fin produit 'nil'. L'ajout d'une instruction de débogage à tester = montre qu'il n'est jamais appelé. Qu'est-ce que je fais mal?

Mise à jour

Je récrit cette question en partie, comme je ne l'ai pas vraiment comprendre le problème quand je l'ai écrit. La question est donc beaucoup plus générale maintenant.

+0

FYI, vous pouvez générer ces getters/setters en utilisant' attr_accessor: test' – rampion

+0

Je sais, cela était juste un exemple. Dans le code, je travaillais avec le getter et le setter pour faire plus de travail. –

+0

duplicata possible de [Pourquoi les setters rubis ont besoin de "soi". qualification dans la classe?] (http://stackoverflow.com/questions/44715/why-do-ruby-setters-need-self-qualification-within-the-class) –

Répondre

8

Vous ne faites rien de "mal" en soi. Ruby pense simplement que vous avez l'intention de mettre le test de la variable locale à val, sans appeler la méthode test=. self.test = val fera ce que vous attendez.

+0

Je pensais que c'était quelque chose comme ça. J'ai essayé test = (val) pensant que cela pourrait convaincre Ruby que j'essaie d'appeler une méthode. Merci! –

+0

Donc, ce serait vrai si un mixin est impliqué ou non? Si aucun récepteur n'est spécifié, Ruby suppose que vous définissez une variable locale? Logique. –

+0

Oui, c'est correct. –

0

Voici quelques autres ressources sur ce (apparemment commun) problème:

Une autre Stack Overflow question: Why do ruby setters need “self.” qualification within the class?

De cette guys's blog:

En tant que débutant Ruby vous avez probablement fait une fois race = "hooman" mais J'ai remarqué que ça ne marchait pas et je me suis dit: "Je ne laisserai pas cela m'arriver à nouveau. ! A partir de maintenant, je vais PREPEND self. chaque fois que je vous appelle une méthode »