1

重複の可能性:
クラス変数とクラスインスタンス変数の違いは?

Rubyの本を読んでいるときに、変数の章を見逃したようです。今、私は次のことを理解できないようです:

  1. インスタンス変数とは何ですか?
  2. クラスインスタンス変数とは何ですか?
  3. variable@instance_varとの違いは何@class_instance_varですか?

別のブログの投稿を読んでみましたが、まだわかりません。どんな助けでもいただければ幸いです。

4

5 に答える 5

4

変数の型がスコープに影響を与える

Web には多くの標準的な説明があり、SO の他の場所にはいくつかの詳細な説明がありますが、別の見方である可変スコープを共有します。

ローカル変数

通常、ローカル変数はメソッドで使用され、ローカル スコープのみを持ちます。例えば:

def foo
  # bar is only in scope within #foo.
  bar = true
end

メソッドが戻るたびに、バー変数はスコープ外になります

インスタンス変数

インスタンス変数は、オブジェクト インスタンスにバインドされたすべてのメソッドで使用できます。実際問題として、これは通常、インスタンス化されたクラス オブジェクト内でスコープを与えます。例えば:

class Foo
  def bar
    @quux = true
  end

  def baz
    @quux == true
  end
end

foo = Foo.new

@quux は完全にグローバルではありませんが、インスタンス化されたfooオブジェクトにバインドされたすべてのメソッドから、パラメーターとして明示的に渡す必要なく可視になります。

クラス変数

クラス変数は、クラスのすべてのインスタンスで共有されます。つまり、インスタンス foo から @@bar を変更すると、インスタンス bar の値も変更されます。

class Foo
  @@bar = true

  def show_class_variable
    @@bar
  end

  def bar= value
    @@bar = value
  end
end

foo = Foo.new
bar = Foo.new

foo.show_class_variable # => true
bar.show_class_variable # => true

foo.bar = false
foo.show_class_variable # => false
bar.show_class_variable # => false

@@bar を変更すると、両方のインスタンスが同時に影響を受けることに注意してください。それがクラス変数の美しさ (そして恐ろしさ) です。

于 2013-01-02T20:04:13.227 に答える
4

インスタンス変数とは

これは、クラスのこのインスタンスに関連する独立した値を持つ変数です。たとえば、Personクラスは@nameand@ageをインスタンス変数として持つことができます。のすべてのインスタンスにPersonは名前と年齢がありますが、各インスタンスはそれらに対して異なる値を持ちます。


クラスインスタンス変数とは?

これは少し奇妙ですが、Personクラス自体が のインスタンスであることを認識しておく必要がありますClass。したがって、インスタンス変数を持つこともできます。これは、クラスの構成によく使用されます。おそらく、API キーをクラスに追加して、そのデータですべてのインスタンスを作成できるようにするのと同じです。

class PersonFetcher

  # class method can set class instance variables
  def self.set_api_key(key)
    @api_key = key
  end

  # instance method sets instance variables
  def set_name(name)
    @name = name
  end

end

変数、@instance_var と @class_instance_var の違いは何ですか?

それがどのように持続するか。

variableローカルです。これは単なるオブジェクトへの参照です。この値を参照するコードまたはオブジェクトがなくなると、ガベージ コレクションによって破棄されます。使い続けてこそ持続します。

@instance_varインスタンスに持続します。インスタンスが存続する限り、それが持つインスタンス変数も存続します。インスタンスが存在する限りPerson、そのインスタンスには@name.

@class_instance_varクラス オブジェクト (これは のインスタンスであることを覚えていますClass) に保持されます。したがって、宣言されたクラスを実際に取り除くことはできないため、クラスオブジェクトに永遠に存在します。

于 2013-01-02T19:35:10.793 に答える
1

変数はメソッドにローカルなものであるため、このメソッドで定義する必要があります。インスタンス変数は、特定のクラスのオブジェクト (のインスタンス) に対して定義され、オブジェクトの値を持つ変数です。クラスインスタンス変数は(あなたが言及@@したシングルとは対照的に)で示され、クラスのすべてのインスタンス間で共有され、そのうちの1つがその値を変更すると、すべてのインスタンスが新しい値を認識します。クラス インスタンス変数は、c++ および Java の静的メンバー変数と同等であり、インスタンス変数は非静的メンバー変数と同等です。@

于 2013-01-02T19:28:33.197 に答える
1

インスタンス変数は、クラスがインスタンス化された時点で定義されます。Pointいくつかのローカル変数とメソッドを定義するclass があるとします。

class Point
  def initialize(x,y)
     @x, @y = x, y
  end

  def add(other)
     Point.new(@x + other, @y + other)
  end
end

定義されたクラスをインスタンス化して変数に割り当てると、クラスがインスタンス化されます。

point = Point.new(2,2)

..これはインスタンス変数です。

Ruby のクラスはオブジェクトであり、他のオブジェクトと同様にインスタンス変数を持つことができます。定義内でclass定義されているが、インスタンス メソッド定義の外で定義されているインスタンス変数は、クラス インスタンス変数と呼ばれます。

例:

class Point 
  @n = 0
  @total_x = 0
  @total_y = 0

  def initialize(x,y)
     @x,@y = x,y
  end
end

3 番目のもの、つまり がありclass variableます。クラス変数は、クラス メソッドとクラスのインスタンス メソッドに表示され、共有されます。インスタンス変数と同様に、クラス変数はクラスの実装で使用できますが、クラスのユーザーには表示されません。クラス変数は で始まります@@。インスタンス変数は常に を参照して評価されますselfclassこれは、外側の定義ステートメントによって作成されたクラス オブジェクトを参照して常に評価されるクラス変数との大きな違いです。同じ例を使用して、コードを次のように書き直すことができます。

class Point
   @@n = 0
   @@total_x = 0
   @@total_y = 0

   def initialize(x,y)
      @x,@y = x, y
      @@n += 1
   end

   def self.report
      puts "Number of points: #{@@n.to_s}"
   end
end
于 2013-01-02T19:34:09.880 に答える
1

簡単なグーグル検索で多くの記事を見つけることができます:

http://blog.codegram.com/2011/4/understanding-class-instance-variables-in-ruby

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

于 2013-01-02T19:35:02.907 に答える