9

モジュールが含まれていて、拡張されていないと仮定すると、モジュールのインスタンス変数とクラス変数の違いは何ですか?

2つの違いはわかりません。

module M
  @foo = 1
  def self.foo
    @foo
  end
end
p M.foo

module M
  @@foo = 1
  def self.foo
    @@foo
  end
end
p M.foo

モジュール内で @ を @@ として使用してきましたが、最近、他のコードがモジュール内で @@ を使用しているのを見ました。それから私はそれを間違って使用していたのではないかと思いました。

モジュールをインスタンス化できないため、モジュールの @ と @@ に違いがあってはなりません。私が間違っている?

----------------------- 以下を追加 --------------------

コメントや投稿に関するいくつかの質問に答えるために、次のこともテストしました。

module M
  @foo = 1
  def self.bar
    :bar
  end

  def baz
    :baz
  end
end

class C
  include M
end

p [:M_instance_variabies, M.instance_variables] # [@foo]
p [:M_bar, M.bar] # :bar

c = C.new
p c.instance_variables
p [:c_instance_variabies, c.instance_variables] # []
p [:c_baz, c.baz] :baz
p [:c_bar, c.bar] # undefined method

クラス内にモジュールを含める場合、モジュール クラス変数とクラス メソッドはクラスで定義されません。

4

3 に答える 3

6

クラス変数は、モジュールと、これらのモジュールが含まれるクラスの間で共有できます。

module A
  @@a = 5
end

class B
  include A
  puts @@a # => 5
end

一方、インスタンス変数は に属しますself。moduleAを classBにインクルードすると、 の object は B の objectと同じselfではないため、それらの間でインスタンス変数を共有することはできません。Aself

module A
  @a = 5
end

class B
  include A
  puts @a # => nil
end
于 2012-09-10T20:09:23.743 に答える
3

@@ はクラス変数を参照し、@ はインスタンス変数を参照します。これをモジュールで使用すると、大きな違いが生じます。モジュールをインクルードすると、インスタンスメソッドをクラスに拡張しながら、クラスメソッドをクラスに追加します

以下はこれに関する素晴らしい記事です

http://railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/

于 2012-09-10T19:44:34.293 に答える
0

モジュールでクラス変数を作成する方法について説明しているこのSO投稿を見つけました。「それらはネイティブにサポートされています。」あるコメンターは、「クラス変数」という名前は誤解を招くとさえ言っています。なぜなら、クラスはいくつかの特別な機能を備えたモジュールにすぎないからです。

私が確信しているのは、クラス変数について読んだほとんどすべての記事で、クラス変数は悪であり、発生する可能性のある奇妙な継承の問題のために、絶対に避けるべきだと考えていることです。

于 2012-09-10T19:46:30.770 に答える