2012-02-14 5 views
0

私は、単一のクラスを継承するいくつかのクラスがあります。コンソールでインスタンス内のクラス変数にアクセスできますか?

class Bravo << Alpha 
class Charlie << Alpha 

アルファは、いくつかのクラスレベルの変数を持っています

class Alpha 
    @@terms 

    def initialize 
    ... 
    @@terms ||= load_terms 
    end 
end 

OK、すべてが今のところ大丈夫です。しかし、トラブルシューティングのためにコンソールからクラスレベルの変数にアクセスしたいと思います。これは可能ですか?私が試した:

# inst is an instance of Bravo for example 
inst.class.superclass:terms 
[email protected]@terms 
inst.class.superclass[:terms] 

本当に私は質問への答えを見つけることができませんでしたので、ちょうどストローでつかんで、仕事にそれの任意のを期待していませんでした。私は、クラス変数が経由してあることを確認しました:OK、私は彼らがあることがわかります

>> inst.class.superclass.class_variables 
=> [:terms] 

が、直接レールコンソール経由でそれらにアクセスする方法はありますか?

答えて

2

あなたはほとんどそれを作った:)

class Alpha 
    @@terms = 'foo' 
end 

class Bravo < Alpha 
end 

b = Bravo.new 
puts b.class.class_variable_get '@@terms' 
# => foo 

それは複雑に見えるかもしれ、そしてそれはおそらく理由でそうである:クラスの内部をいじってから人々を落胆する(それが本当ならば、私は知りません、私はそれをとしました)。

これを定期的に必要とする場合は、アクセサーを追加してください。

class Alpha 
    @@terms = 'foo' 

    def self.terms 
    @@terms 
    end 
end 


puts Alpha.terms 
# => foo 
+0

を '用いることであろうことは:@@ terms'ていますが、とにかく1を取得します。 –

+0

@Sergio ok、それはうまくいっていますが、それは複雑です。 Rubyで何かを実行すると、それは本当に複雑です - 通常はとても簡単です。 C#では、スーパークラスからの変数またはクラスからの変数へのアクセスに実際には違いはありません。 :/ – jcollum

+0

@jcollum:まあ、それはC#ではない:)答えを更新しました。 –

2

、このような目的のために非常に有用でpry宝石、(Railsのコンソールとして動作することができます)試してみてください:わずかに良い

$ pry 
[1] pry(main)> class A 
[1] pry(main)* @@a = 1 
[1] pry(main)* end 
=> 1 
[2] pry(main)> a = A.new 
=> #<A:0x101ba8ea0> 
[3] pry(main)> cd a.class 
[4] pry(A):1> @@a 
=> 1 
[5] pry(A):1> cd/
[6] pry(main)> cd A 
[7] pry(A):1> @@a 
=> 1 
+0

オブジェクトをディレクトリのように扱っていますか?それは特有です。それが動作すれば、それは動作します。 – jcollum

関連する問題