Почему это общедоступно в моем примере: «MySymbol :: TABLE» - PullRequest
2 голосов
/ 18 марта 2009
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

В приведенном выше примере, который я нашел в блоге, я понимаю, что TABLE является хешем и является членом класса MySymbol. Чего я не понимаю, так это того, как к нему можно получить доступ изнутри класса String. Я думал, что переменные экземпляра класса по умолчанию закрыты, и вам нужно использовать методы get / set для доступа к ним извне класса?

1 Ответ

5 голосов
/ 18 марта 2009

В вашем примере TABLE - это константа, а не переменная экземпляра (или класса) (т. Е. Без префикса с @.)

Кроме того, переменные экземпляра не являются «закрытыми по умолчанию» (например, как в случае с классами C ++), хотя это может выглядеть поверхностно; они просто недоступны за пределами класса по замыслу не потому, что они являются «частными» (вы не можете сделать их «не частными».)

...