2012-11-16 73 views
2

如何在Ruby中獲得類似Java的效果?帶嵌套類的共享作用域

class Outer { 
    final boolean switch 
    public Outer(boolean someSwitch) { 
    switch = someSwitch 
    } 

    class Inner { 
    public void doSomething() { 
     if (switch) { 
     //behave like this 
     } else { 
     //behave like that 
    } 
    } 
} 

不要緊,交換機必須是最終的;在斯卡拉,它沒有。無論如何。我的內部類生活在外部實例的範圍內,這就是我喜歡的方式。而且我不必將開關傳遞給每個單獨的內部實例。

在Ruby中,我可以在另一個類中嵌套一個類,但這並不意味着除了名稱空間之外的任何東西。我如何得到我想要的效果?我知道這個問題有點含糊,所以即使你不確定,也可以隨意採取措施。

回答

4

Ruby中沒有嵌套類,更多信息here。但是Ruby很棒,因爲它可以幫助你做到這一點。

module M 
    class Outer 
    attr_accessor :foo 

    def say_hello() 
     puts "Hello Outer '#{@foo}'" 
     Inner.new(self).say_hello() 
    end 

    private 

    class Inner 

     def initialize(parent) 
     @parent = parent 
     end 
     def say_hello() 
     puts "Hello Inner '#{@parent.foo}'" 
     end 
    end 
    end 
end 


instance = M::Outer.new 
instance.foo = "foo values" 
instance.say_hello 

#=> Hello Outer 'foo values' 
#=> Hello Inner 'foo values' 
+0

我想要避免的是必須將「父」參數傳遞給內部類,並且必須在內部類中保留另一個實例變量來保存對父級的引用。我的小內部類在其初始化方法中已經有足夠的參數,並且已經有足夠的實例變量。 – Ladlestein

+0

我知道,但我認爲你在上面的鏈接中留下了一些方法。在我看來,這是清理,也許其他一些將取決於你喜歡。 –