为什么在我的示例中可以公开访问:“MySymbol :: TABLE”

时间:2009-03-18 01:44:45

标签: ruby class hash scope public

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 个答案:

答案 0 :(得分:5)

在您的示例中,TABLE是常量,而不是实例(或类)变量(即没有前缀为@。)

此外,实例变量不是默认的“私有”(例如,与C ++类一样),尽管它可能表面上看起来那样;它们根本无法在类设计之外访问,而不是因为它们是“私有的”(你不能使它们成为“非私人”。)