重複の可能性:
クラス変数とクラスインスタンス変数の違いは?
Rubyの本を読んでいるときに、変数の章を見逃したようです。今、私は次のことを理解できないようです:
- インスタンス変数とは何ですか?
- クラスインスタンス変数とは何ですか?
variable
、@instance_var
との違いは何@class_instance_var
ですか?
別のブログの投稿を読んでみましたが、まだわかりません。どんな助けでもいただければ幸いです。
重複の可能性:
クラス変数とクラスインスタンス変数の違いは?
Rubyの本を読んでいるときに、変数の章を見逃したようです。今、私は次のことを理解できないようです:
variable
、@instance_var
との違いは何@class_instance_var
ですか?別のブログの投稿を読んでみましたが、まだわかりません。どんな助けでもいただければ幸いです。
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 を変更すると、両方のインスタンスが同時に影響を受けることに注意してください。それがクラス変数の美しさ (そして恐ろしさ) です。
インスタンス変数とは
これは、クラスのこのインスタンスに関連する独立した値を持つ変数です。たとえば、Person
クラスは@name
and@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
) に保持されます。したがって、宣言されたクラスを実際に取り除くことはできないため、クラスオブジェクトに永遠に存在します。
変数はメソッドにローカルなものであるため、このメソッドで定義する必要があります。インスタンス変数は、特定のクラスのオブジェクト (のインスタンス) に対して定義され、各オブジェクトの値を持つ変数です。クラスインスタンス変数は(あなたが言及@@
したシングルとは対照的に)で示され、クラスのすべてのインスタンス間で共有され、そのうちの1つがその値を変更すると、すべてのインスタンスが新しい値を認識します。クラス インスタンス変数は、c++ および Java の静的メンバー変数と同等であり、インスタンス変数は非静的メンバー変数と同等です。@
インスタンス変数は、クラスがインスタンス化された時点で定義されます。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
ます。クラス変数は、クラス メソッドとクラスのインスタンス メソッドに表示され、共有されます。インスタンス変数と同様に、クラス変数はクラスの実装で使用できますが、クラスのユーザーには表示されません。クラス変数は で始まります@@
。インスタンス変数は常に を参照して評価されますself
。class
これは、外側の定義ステートメントによって作成されたクラス オブジェクトを参照して常に評価されるクラス変数との大きな違いです。同じ例を使用して、コードを次のように書き直すことができます。
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
簡単なグーグル検索で多くの記事を見つけることができます:
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/