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)
下に含ま呼び出しを移動するには、エラーが発生します '<トップ(必須)>で「:未定義のメソッドのアプリ」#<電話用: 0x007fe9c989c4b0>(NoMethodError) 'です。また、提案した2番目の方法を使用している場合、どのクラスでinitializeメソッドとすべてのインスタンス変数を宣言しますか? –
あなたは定義されていないメソッドエラーからやっているように、インスタンススコープのincludeを呼び出すべきではありません。私はあなたが 'クラスの電話機'の '終わり 'の直前にインクルードコールを移動できることを意味しました。初期化に関しては、どのモジュールでもこれを定義できます。それらを含めると、すべてのインスタンスメソッドが結合されます。つまり、 'initialize'を複数定義した場合、' super'を呼び出さない限り、それらのうちの1つだけが実行されます。 –