2012-03-17 4 views
0

Je termine le Rubyist Well Grounded et j'ai remarqué des appels de variable d'instance que je ne comprends pas très bien. Droit de TWGR (Section 15.2.2):Ruby Instance Variable Syntaxe

class Person 
    attr_reader :name 
    def name=(name) 
    @name = name 
    normalize_name 
    end 

    private 
    def normalize_name 
    name.gsub!(/[^-a-z'.\s]/i, "") 
    end 
end 

est la variable name dans la méthode normalize_name une variable d'instance implicite? Est-ce que @name.gsub!(/[^-a-z'.\s]/i, "") aurait fonctionné aussi bien? Y a-t-il une convention dont je devrais être au courant?

Répondre

2

Qu'est-ce qui se passe dans normalize_name est que name décide de la méthode self.name, qui est définie par la macro de classe attr_reader au sommet de la classe. Si vous deviez utiliser attr_accessor à la place, la méthode name= serait définie comme bien (mais il ne comprend pas l'appel à normalize_name.

Ces méthodes getter et setter accès automatiquement les variables d'instance. La méthode name définie par attr_accessible :name ressemble ce, essentiellement:

def name 
    @name 
end 
+0

La référence à la variable '@ name' directement au lieu de la méthode' name' aurait-elle fonctionné? Y at-il un avantage à utiliser la méthode 'name'? – rringler

+0

Yup. Ils font la même chose de base, mais il est plus sûr d'utiliser le getter - et si plus tard sur la ligne vous décidez de modifier les données en lecture au lieu d'écrire? – coreyward

+0

J'ai compris. Merci de votre aide! – rringler

0

est la variable name dans la méthode normalize_name une variable d'instance implicite

?

Non, ce n'est pas une variable d'instance. Les variables d'instance commencent par un sigil @, ce qui n'est pas, ergo, une variable d'instance. En fait, ce n'est pas une variable du tout, c'est un message envoyé.