2017-01-22 3 views
0

Rubyでかなり大きなアプリケーションを作成しましたが、1つの巨大クラスのすべてをインスタンスメソッドとして持つためにはかなり組織化されていないことに気がついたので、ちょっと体系化しています。私はStackOverflowを検索しましたが、実際にクラスにネストされたモジュールを使用するのは一般的ではないようです。クラス内にネストされたRubyモジュール

私は単純な例クラスを使用して、どのように動作するか、ネストされたモジュールを理解しようとしています:

class Phones 

    include Apps 
    include Call 

    attr_accessor :brand, :model, :price, :smartphone 
    def initialize(brand,model,price,smartphone=true) 
    @price = price 
    @brand = brand 
    @model = model 
    @smartphone = smartphone 
    @task = 'stand-by' 
    end 

    module Apps 
    public def camera 
     @task = __method__.to_s 
     puts "Took a picture!" 
     self 
    end 
    public def gallery 
     @task = __method__.to_s 
     puts "Photos!" 
     self 
    end 
    end 

    module Call 
    public def scall 
     @task = __method__.to_s 
     puts "Ring ring!" 
     self 
    end 
    end 

end 

その後、私は実行しようとしている:

s7 = Phones.new('Samsung','S7 Edge',3000).Apps.camera 

をしかし、私はこのエラーを取得しておいてください。

...phones.rb:3:in `<class:Phones>': uninitialized constant Phones::Apps (NameError) 

答えて

0

問題はincludeの呼び出しが実際のモジュール定義の前にあることですアイオン。

クラス定義を書き込むと、メソッド定義のようなものを除き、クラス定義内のすべてが即座に実行されます。たとえば:

class Foo 
    puts 1 + 1 
end 

は、あなたがFoo.newを言うまでは待機しません、すぐ 2を印刷します。

修正する方法の1つは、include呼び出しをクラス定義の最後に移動するか、モジュールを先頭に移動することです。また、ネストされたモジュールを分離することができます:phones.rb:38:

class Phones 
    module Apps 
    # your stuff here 
    end 
end 

class Phones 
    module Call 
    # stuff 
    end 
end 

# just make sure the previous modules have been defined 
# by the time this code is run 
class Phones 
    include Call 
    include Apps 
end 
+0

下に含ま呼び出しを移動するには、エラーが発生します '<トップ(必須)>で「:未定義のメソッドのアプリ」#<電話用: 0x007fe9c989c4b0>(NoMethodError) 'です。また、提案した2番目の方法を使用している場合、どのクラスでinitializeメソッドとすべてのインスタンス変数を宣言しますか? –

+0

あなたは定義されていないメソッドエラーからやっているように、インスタンススコープのincludeを呼び出すべきではありません。私はあなたが 'クラスの電話機'の '終わり 'の直前にインクルードコールを移動できることを意味しました。初期化に関しては、どのモジュールでもこれを定義できます。それらを含めると、すべてのインスタンスメソッドが結合されます。つまり、 'initialize'を複数定義した場合、' super'を呼び出さない限り、それらのうちの1つだけが実行されます。 –

関連する問題