0

クラス変数インスタンス変数の間に明確な違いがあるとは思いません。クラス変数は、インスタンス変数と見なすこともできます。私は正しいですか?

例えば:

class Test
  @class_var = 'hello world'

  def self.show_class_var
    @class_var
  end

  def show_class_var
    puts self.class.show_class_var
  end
end

したがって、クラス変数を現在のクラスのインスタンス変数として扱うことができると思います ( Test)。を定義した場合の唯一の利点は、インスタンス メソッドで@@class_var = 'hello world'直接参照できることです。@@class_var私が正しいかどうか知りたいだけです。私ですか?

4

3 に答える 3

3

ローカル変数、インスタンス変数、クラス変数の違いについては「インスタンス変数とクラス変数とRubyの違い」がわかりやすいと思います。

于 2013-06-24T13:24:04.020 に答える
1

クラス変数とインスタンス変数の間に明確な違いがあるとは思いません。

いいえ、微妙な違いがあります。ウェイン・コンラッドが彼の答えで述べているように:

クラス変数 (@@) は、クラスとそのすべての子孫の間で共有されます。

クラス インスタンス変数 (@) は、クラスの子孫によって共有されません。

@@ : クラス変数 ( を使用することをお勧めしますclass instance variable.class variable

class Foo;end
#setting class variable @@var
Foo.class_variable_set(:@@var, "good morning!")
#getting class variable @@var via Foo
Foo.class_variable_get(:@@var) # => "good morning!"
class Bar < Foo ;end
#getting class variable @@var via Bar subclass of Foo
Bar.class_variable_get(:@@var) # => "good morning!"

@ : インスタンス変数

class Foo;end
foo = Foo.new
#setting instance variable @var
foo.instance_variable_set(:@var, "good morning!")
#getting instance variable @var via foo object
foo.instance_variable_get(:@var) # => "good morning!"
class Bar < Foo ;end
bar = Bar.new
#getting instance variable @var via bar object,whose class is a subclass of Foo
bar.instance_variable_get(:@var) # => nil 
于 2013-06-24T13:13:07.570 に答える
1

ひねりを加えた+1 OMGの答え:クラスはそれ自体がオブジェクトであることを忘れないでください。つまり、クラス自体には3番目のクラスではなく、実際にはインスタンスタイプの変数もあります。 .

例:

class A
  # instance variable of objects of class A (and its subclasses)
  # not shared between instances
  def foo; @foo; end
  def foo=(foo); @foo = foo; end

  class << self
    # instance variable of class A
    # not available to subclasses of A
    def bar; @bar; end
    def bar=(bar); @bar = bar; end
  end

  # class variable of A
  # shared by subclasses of A
  def baz; @@baz; end
  def baz=(baz); @@baz = baz; end
end

class B < A; end

上記を使用すると、次のようになります。

a = A.new
b = B.new

a.foo = :foo
a.class.bar = :bar
a.baz = :baz

p a.foo         # :foo
p a.class.bar   # :bar
p a.baz         # :baz

p b.foo         # nil
p b.class.bar   # nil
p b.baz         # :baz
于 2013-06-24T13:35:36.167 に答える