Perché questo è pubblicamente accessibile nel mio esempio: & # 8220; MySymbol :: TABLE & # 8221;
Domanda
class MySymbol
TABLE={}
def initialize(str) @str = str end
def to_s() @str end
def ==(other)
self.object_id == other.object_id
end
end
class String
def my_intern
table = MySymbol::TABLE
unless table.has_key?(self)
table[self] = MySymbol.new(self)
end
table[self]
end
end
"foo".my_intern
Nell'esempio sopra, che ho trovato su un blog, capisco che TABLE è un hash ed è un membro della classe MySymbol. Quello che non capisco è come è possibile accedervi pubblicamente dall'interno della classe String. Pensavo che le variabili di istanza della classe fossero private per impostazione predefinita e devi usare i metodi get / set per accedervi dall'esterno della classe?
Soluzione
Nel tuo esempio, SPAZIO PER TABELLA
è una variabile costante, non un'istanza (o classe) (ovvero non preceduta da @
.)
Inoltre, le variabili di istanza non sono " private per impostazione predefinita " (ad es. come nel caso delle classi C ++), sebbene possa apparire superficialmente in quel modo; semplicemente non sono accessibili al di fuori della classe in base alla progettazione , non perché sono " private " (non puoi renderli " non privati ??" ;.)