2011-07-18 4 views
3

、私はこのような何かするとき:Ruby/IRB:インスタンス変数をプライベートに設定するか、そうでなければ見えませんか? Rubyでは

class Foo 
    ... 
    def initialize(var) 
    @var = var 
    end 
    ... 
end 

を私は、このオブジェクト表現を取得し、コンソールにfooを返す場合、:

#<Foo:0x12345678910234 @var=...........> 

時々私が長いインスタンス変数を持っていますハッシュや何かがあり、オブジェクトの残りの部分を読むのがはるかに難しくなります。

私の質問は:オブジェクト内のインスタンス変数を「プライベート」またはそれ以外の場合は不可視に設定する方法があります。オブジェクトが返された場合、オブジェクト表現の一部として出力されません。コンソール?

ありがとうございます!

答えて

4

私はRubyがプライベートインスタンス変数をサポートしているとは思っていません。オブジェクトのto_sメソッド(またはmonkey patch Object#to_s)をオーバーライドして、表示するインスタンス変数のみを出力することをお勧めします。物事を簡単にするために、あなたが非表示にする変数のブラックリストを作成することができます。彼らはまだobj.instance_variablesobj.instance_variable_getを通じてアクセスすることができますが、非常に少なくとも、彼らはの邪魔にならないであろうことを

class Foo 
    BLACK_LIST = [ :@private ] 

    def initialize(public, private) 
    @public = public 
    @private = private 
    end 

    def to_s 
    public_vars = self.instance_variables.reject { |var| 
     BLACK_LIST.include? var 
    }.map { |var| 
     "#{var}=\"#{instance_variable_get(var)}\"" 
    }.join(" ") 

    "<##{self.class}:#{self.object_id.to_s(8)} #{public_vars}>" 
    end 
end 

注意をあなたのデバッグ

+0

これは完璧な意味合いで、 'to_s'をオーバーライドすることは、私が取り組んでいることに対する非常に単純な修正となるでしょう。私は返されたオブジェクトのコンソール出力が 'to_s'メソッドからとられたということは決して実際には起こっていないと思います! – Andrew

関連する問題