2012-11-25 64 views
0

我有一個類中定義的實例方法:Ruby:如何從模塊調用Class的實例方法?

class Foo 
    def is_linux 
    # some code... 
    # returns true or false 
    end 
end 

,我想調用此方法的模塊:

class Foo 
    module Dog 
    is_linux? ? puts "Is Linux" : puts "Is Windows" 
    end 
end 

這給了我下面的錯誤:

NoMethodError: undefined method `is_linux?' for Foo::Foo:Module 

我知道我可以寫

class Foo 
    module Dog 
    Foo.new.is_linux? ? puts "Is Linux" : puts "Is Windows" 
    end 
end 

但我想知道是否有模塊訪問當前實例的方法?

回答

1

基本上,您需要以某種方式「共享」您的實用方法。

我建議將它們放到一個mixin:

module Mixin 
    def is_linux? 
    true 
    end 
end 

class Foo 
    include Mixin # adding methods at instance level 
end 

class Foo 
    module Dog 

    extend Mixin # adding methods at class level 

    puts is_linux? ? "Is Linux" : "Is Windows" 

    end 
end 

#=> Is Linux 
1

沒有這樣的選項,因爲子類型(如模塊)沒有連接到他們的父母實例。如果你需要這樣的構造,你只能製作is_linux?類方法。如果沒有這種可能性,那麼你可能有錯誤的設計。

相關問題