Perché questo è pubblicamente accessibile nel mio esempio: & # 8220; MySymbol :: TABLE & # 8221;

StackOverflow https://stackoverflow.com/questions/656693

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?

È stato utile?

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 ??" ;.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top