2012-05-25 2 views
2

Итак, я пытаюсь использовать mixins и метапрограммирование в рубине и не могу заставить это работать для меня. Я хочу, чтобы напечатать «Бабуин»Доступ к внешнему классу доступа из внутреннего класса

module A 

    def self.included(base) 
     base.extend ClassMethods 
    end 

    module ClassMethods 
    def install_A 
     include InstanceMethods 
    end 
    end 

    module InstanceMethods 
     class B 
     def testB 
      #What goes here??? 
      A.monkey 
     end 
     end 

     attr_accessor :monkey 

     def initialize() 
     @monkey = "baboon" 
     end 

     def test 
      b = B.new 
      puts b.testB 
     end 
    end 
end 

class Chimp 
    include A 
    install_A 
end 

c = Chimp.new 
c.test 

ответ

4

B является его собственным автономным классом. Он не связан или не связан ни с одним из других классов или модулей, кроме как сказать, что экземпляр класса B создается внутри InstanceMethods::test. Объявление class B внутри определения для module InstanceMethods ограничивает область действия B так, что оно не видно за пределами InstanceMethods, но оно не связывает B и InstanceMethods.

Что нужно сделать, чтобы переменная модуля была видимой внутри B. Вы можете реализовать метод initialize для B, который принимает параметр, и InstanceMethods::test может использовать b = B.new(@monkey) для передачи значения B (убедитесь, что B::initialize хранит это значение как переменную экземпляра).

+0

А, ок. Наверное, я переношу правила определения внутренних классов с других языков. Спасибо! – Sandro

Смежные вопросы