2009-03-18 11 views
2
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メソッドを使用する必要がありますか?あなたの例では私の例ではこれが一般にアクセス可能なのはなぜですか? "MySymbol :: TABLE"

答えて

5

TABLEは一定ではなく、インスタンス(またはクラス)である変数(すなわちウィット@を前に付けていない。)

また、インスタンス変数は、(「デフォルトでプライベート」ではありません場合であるなどとして、 C++クラスで)、それは表面的に見えるかもしれませんが、彼らは単にのクラスのデザインでアクセスすることはできません。「プライベート」ではありません(「非公開」にすることはできません)。

関連する問題