43

モジュールのインスタンスを作成できない場合でも、モジュールにインスタンス変数を含めることができるのはどうしてですか? 以下の@stackモジュールの目的は何ですか?Stacklike

module Stacklike
  def stack
    @stack ||= []
  end
end
4

4 に答える 4

50

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"

于 2013-03-18T14:17:23.820 に答える
17

以下を参照してください。

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会社も、とは異なる独自の形式でスタックポリシーを使用していますAStackしたがって、内部class Aで操作を設計する場合はclass B、両方として共通の場所に記述し、この機能を共通に持つことをお勧めしますAB将来、別の会社があなたのところに来た場合、それぞれに同じ機能をC書き直すことなく、そのモジュールをそのクラスに使用することもできます。ABC。もっと考えられるかもしれませんが、これが質問の最後の部分について自分自身に答えるのに役立つことを願っています。

コンセプトは以上です。それが役に立てば幸い。

乾杯!!

于 2013-03-18T14:18:57.377 に答える
5

モジュールをクラスに含めると、そのすべてのインスタンスメソッドが効果的にホストクラスに「貼り付け」られます。だからあなたが持っているなら:

class Lifo
  include Stacklike
end

l = Lifo.new
l.add_to_stack(:widget)

次に、から持ち込まれlたインスタンス変数があります。@stackStacklike

于 2013-03-18T14:18:00.140 に答える
4

モジュールStacklikeを他のクラスに含めると、そのインスタンス変数は、そのクラスで定義されているかのように使用できます。これにより、モジュール自体から基本クラスのインスタンス変数を設定および処理するオプションが提供されます。

于 2013-03-18T14:18:14.707 に答える