モジュールのインスタンスを作成できない場合でも、モジュールにインスタンス変数を含めることができるのはどうしてですか? 以下の@stackモジュールの目的は何ですか?Stacklike
module Stacklike
def stack
@stack ||= []
end
end
Think of the instance variable as something which will exist in any class that includes your module, and things make a bit more sense:
module Stacklike
def stack
@stack ||= []
end
def add_to_stack(obj)
stack.push(obj)
end
def take_from_stack
stack.pop
end
end
class ClownStack
include Stacklike
def size
@stack.length
end
end
cs = ClownStack.new
cs.add_to_stack(1)
puts cs.size
will output "1"
以下を参照してください。
p RUBY_VERSION
module Stacklike
def stack
@stack ||= []
end
def add_to_stack(obj)
stack.push(obj)
end
def take_from_stack
stack.pop
end
end
class A
include Stacklike
end
a = A.new
p a.instance_variables #<~~ E
p a.instance_variable_defined?(:@stack) #<~~ A
a.add_to_stack(10) #<~~ B
p a.instance_variable_defined?(:@stack) #<~~ C
p a.instance_variables #<~~ D
出力:
"1.9.3"
[]
false
true
[:@stack]
説明:はい、Moduleインスタンス変数は、クラス内に存在するclass場合に存在します。しかし、それがAまで定義されていないように表示されincludeていることがわかります。ポイントBで、インスタンス変数@stackを定義しました。したがって、ポイントCのステートメントは、として出力されます。モジュールインスタンス変数がモジュール自体によって作成されていないことを意味しますが、そのモジュールが含まれている場合はインスタンスによって作成できます。Eのステートメントは、インスタンス変数が定義されていないことを示していますが、行Dの出力を見ると、p a.instance_variable_defined?(:@stack)false@stacktrueclassclass[]@stackのオブジェクト内にありaますclass A。
なぜそのようなデザイン?
これは設計であるか、場合によっては要件に由来します。2つのチケット予約会社SayAとで使用されるスタック操作コードを作成するように求められたとしBます。これAで、顧客がサービスを提供するためのスタックポリシーが作成されましたが、それ以上の手続きもあります。B会社も、とは異なる独自の形式でスタックポリシーを使用していますA。Stackしたがって、内部class Aで操作を設計する場合はclass B、両方として共通の場所に記述し、この機能を共通に持つことをお勧めしますA。B将来、別の会社があなたのところに来た場合、それぞれに同じ機能をC書き直すことなく、そのモジュールをそのクラスに使用することもできます。ABC。もっと考えられるかもしれませんが、これが質問の最後の部分について自分自身に答えるのに役立つことを願っています。
コンセプトは以上です。それが役に立てば幸い。
乾杯!!
モジュールをクラスに含めると、そのすべてのインスタンスメソッドが効果的にホストクラスに「貼り付け」られます。だからあなたが持っているなら:
class Lifo
include Stacklike
end
l = Lifo.new
l.add_to_stack(:widget)
次に、から持ち込まれlたインスタンス変数があります。@stackStacklike
モジュールStacklikeを他のクラスに含めると、そのインスタンス変数は、そのクラスで定義されているかのように使用できます。これにより、モジュール自体から基本クラスのインスタンス変数を設定および処理するオプションが提供されます。