2010-11-11 3 views
1

juste curieux pourquoi je ne peux pas enlever la variable locale déclarée du tableau 'local_variables'.Comportement des variables locales - quelqu'un peut-il expliquer?

Exemple:

x=1 
myarr = local_variables.clone 
p local_variables 
=> [:x, :_] 
p myarr 
=> [:x, :_] 
p local_variables.class 
=> Array 
p myarr.class 
=> Array 
myarr.delete :x 
p myarr 
=> [:_] 
local_variables.delete :x 
p local_variables 
=> [:x, :_] 

WTF?

J'ai suspecté d'appeler local_variables.delete avec le paramètre: x le réinsère lorsqu'il est déclaré à nouveau. Mais s'il est appelé avec un autre symbole précédemment non déclaré ne le change pas:

p local_variables 
=> [:x, :_] 
local_variables.delete :whatever 
p local_variables 
=> [:x, :_] 

Quelqu'un peut-il expliquer?

Thx.

Répondre

4

Tenir compte de la méthode suivante:

def foo 
    [42, 23, 13] 
end 

foo #=> [42, 23, 13] 
foo.delete 23 
foo #=> [42, 23, 13] 

Est-ce que le comportement surprise vous?

Chaque fois que vous appelez local_variables (ou foo), un nouveau tableau est créé. Si vous modifiez ce nouveau tableau qui n'a aucun effet sur ce qui se passera si vous appelez local_variables à nouveau.

+0

Je vois, c'est juste une méthode retournant une instance de tableau. C'est une explication. Je vous remercie. –

+0

Il se contente de poser une question sur la façon de déterminer de façon programmatique à l'exécution si un symbole est une variable ou une méthode. Cela doit être possible parce que l'interprète Ruby doit savoir comment le gérer. –

+0

@David: 'variables_sales.include? (Symbole)' – sepp2k

0

il est AFAIK pas possible de supprimer des variables:

http://programming.itags.org/ruby/64695/

+0

C'est étrange et cela semble un peu incohérent. Pourquoi se comporte-t-il différemment bien que les deux soient des instaces de la même classe Array? –

5

local_variables retourne un tableau contenant les noms de toutes les variables locales actuellement déclarées. Vous pouvez faire tout ce que vous voulez avec ce tableau, mais cela ne va évidemment pas affecter les variables locales déclarées. Pourquoi le ferais-tu? Si vous supprimez un nom du répertoire, cette personne est-elle morte?

+0

+1 pour l'analogie du répertoire. – Zabba

+0

D'accord, il ne contient que des noms de variables locaux. Mais pourquoi la méthode .delete ne fonctionne pas comme dans d'autres instances de la classe Array? C'était le but de ma question. –

+0

@David Unric: Que voulez-vous dire par "la méthode' '.delete' ne fonctionne pas comme dans les autres instances de la classe' Array'? " Je ne vois pas comment ça se passe. 'Array # delete' supprime un objet d'un tableau, ce qui est exactement ce qu'il fait ici. Vous ne stockez pas de référence à ce tableau, donc vous ne pourrez * jamais * réellement * vérifier * qu'il a été supprimé, mais cela l'était toujours. (En fait, vous pouvez utiliser 'ObjectSpace.each_object (Array)' pour trouver le tableau et le vérifier de cette façon, ou vous pouvez juste l'assigner à une variable.) –

Questions connexes