ここには素敵な記事 - Class and Instance Variables In Rubyがあります。
基本的に、何を行うことができますすることです。
class A
class << self
attr_accessor :class_var
end
def set_class_var(value)
self.class.class_var = value
end
def get_class_var
self.class.class_var
end
end
class B < A; end
A.class_var = 'a'
B.class_var = 'b'
puts A.class_var # => a
puts B.class_var # => b
A.new.set_class_var 'aa'
B.new.set_class_var 'bb'
puts A.new.get_class_var # => aa
puts B.new.get_class_var # => bb
それを理解するには、およそA
Class
クラスのインスタンスとしてを考えなければならない(とそれはそれはRubyでいる方法です)。 foo
だけA
クラスのすべてのインスタンスのためのa
オブジェクトとないために定義された方法であり、その場合には
a = A.new
def a.foo
puts 'foo'
end
:しかし、Rubyではすべてのオブジェクトは、オブジェクト自体に定義されたメソッドのようなオブジェクト固有のものを格納し、独自のシングルトンクラスを持っています。 (それは少しトリッキーだ我々はA
クラスのシングルトンクラスのコンテキストでclass_var
属性アクセサを定義するためにこのアプローチを使用して最初のコードスニペットで
class << a # open a's singleton class
def bar # define method that will be available only on 'a' object
puts 'bar'
end
end
:そして、オブジェクトのシングルトンクラスでメソッドを定義する別の方法は、そのようなものですあなたはそれについて考えなければなりません)。結果クラス自体はclass_var
変数とその子孫クラスB
を持ちます。違いは、それらのすべてが干渉しない独自の変数class_var
を持っていることです。
インスタンス変数が必要なのは確かですか? (例:@vの代わりに@v) – cvshepherd