2016-11-07 13 views
1

JRubyの匿名クラスから親クラスの変数にアクセスする方法は?
(静的変数を使用せずに)JRubyの匿名クラス

class MyJRubyClass 
    def initialize 
     @var1 = 1 
     @var2 = Class.new{ 
      def Method1 
       @var1 = @var1 + 1 
       print @var1 
      end 
      }.new 
     @var2.Method1() 
    end 
end 

ありがとうございます。

+0

普通のRubyと同じですか?あなたが何を意味しているのかわからないのは、JRubyに移植しようとしているJavaのコンセプトのように聞こえるのは、それがJava上で実行されているからです。 – kares

+0

はい、そのようなものです。 –

答えて

1

新しい言語に慣れるには、常に少し時間がかかります(そして練習する)必要があります。 Rubyでは、 '排他的な'親クラスアクセスを持つJavaの内部クラスの概念は適切ではありません。

OOPのスタンドポイントでは、関連するクラスが内部で協調するのに便利ですが、メッセージを使用して協力する「ブラックボックス」である必要があるため、祝福されません。これは何とかRubyのアプローチです。

一方、RubyはリフレクションAPIを持っているので何も隠さない。インスタンス変数を取得します(この例では、属性リーダー/ライターを公開することを好みます)。

class MyJRubyClass 
    attr_accessor :var1 
    def initialize 
    @var1 = 1 
    klass2 = Class.new do 
     def initialize(parent); @parent = parent end 
     def Method1 
     print @parent.var1 = @parent.var1 + 1 
     # without attr accessor : 
     #var1 = @parent.instance_variable_get(:@var1) 
     #@parent.instance_varialbe_set(:@var1, var1 + 1) 
     end 
    end 
    @var2 = klass2.new(self) 
    @var2.Method1() 
    end 
end