(Domanda già pubblicata allo Ruby Forum, ma non ha evocato alcuna risposta lì).Il metodo di istanza aggiunto dinamicamente non può accedere alla variabile di classe
Questo è il mio codice:
class MC
def initialize
@x = 5
@@y = 6
end
def f
puts @x
puts @@y
end
end
m = MC.new
m.f
m.f
produce i risultati attesi, senza un errore:
5
6
Ma questo:
def m.g
puts @x
puts @@y
end
m.g
produce:
5
warning: class variable access from toplevel
NameError: uninitialized class variable @@y in Object
Perché è possibile accedere a @@y
da f
, ma non da g
?
La menzione di toplevel
e Object
nell'avviso e il messaggio di errore mi lascia perplessi.
@x
viene stampato come 5
, quindi l'ambiente è MC
. Ciò esclude la possibilità che @x
e @@y
nella definizione di m.g
faccia riferimento all'ambiente di primo livello (Object
) anziché MC
.
Perché ho ricevuto il messaggio di errore?
Questo è stato chiesto prima: http://stackoverflow.com/q/24510948/477037 – Stefan
@Stefan: vero. Sfortunatamente, non c'è una buona spiegazione anche lì. –