2010-10-07 3 views
1

Я не могу получить доступ к переменной экземпляра внешнего класса во внутреннем классе. Его простой качели приложение, которое я создаю с помощью JRuby:Доступ к частным членам внешнего класса во внутреннем классе: JRuby

class MainApp 
def initialize 
    ... 
    @textArea = Swing::JTextArea.new 
    @button = Swing::JButton.new 
    @button.addActionListener(ButtonListener.new) 

    ... 
end 

class ButtonListener 
    def actionPerformed(e) 
     puts @textArea.getText #cant do this 
    end 
end 
end 

Единственный способ решения проблемы я могу думать, это:

... 
@button.addActionListener(ButtonListener.new(@textArea)) 
... 

class ButtonListener 
    def initialize(control) 
    @swingcontrol = control 
    end 
end 

, а затем использовать @swingcontrol модули место @textArea в ' actionPerformed '.

+0

Это возможно в java. Так почему же здесь нет? – badmaash

+0

Потому что Ruby - это не Java. Правила обзора различны. – hallidave

ответ

0

Я думаю, что невозможно получить доступ к внешним членам класса из внутреннего класса, не прибегая к хакам. Поскольку @textArea в классе ButtonListener отличается от @textArea в MainApp.

(Я новичок в Ruby, так что я мог бы быть неправильно об этом. Так что, не стесняйтесь, поправьте меня)

+0

То что происходит хорошо. Угадай, что мне придется проходить «я» из MainApp c'tor вместо того, чтобы проходить контроль. Таким образом, все элементы управления будут доступны в классе слушателя. – badmaash

0

Рубин способ сделать это, чтобы использовать блок, а не вложенного класса.

class MainApp 
def initialize 
    ... 
    @textArea = Swing::JTextArea.new 
    @button = Swing::JButton.new 
    @button.addActionListener do |e| 
     puts @textArea.getText 
    end 

    ... 
end 
end