ニールはこれについて素晴らしい答えを持っています。私はそれに何かを追加したいだけです.
犬を数える:)
これを行うにはクラス変数が必要です..
class Dog
@@count = 0 # this is a class variable; all objects created by this class share it
def initialize
@@count += 1 # when we create a new Dog, we increment the count
end
def total
@@count
end
end
「Class オブジェクトのインスタンス変数」でこれを行う別の方法がありますが、それは少し高度なトピックです。
インスタンス変数へのアクセス
Ruby では、変数は実際にはオブジェクト / インスタンスへの参照にすぎません。
> x = 1
=> 1
> x.class
=> Fixnum
> 1.instance_variables
=> []
x は、Fixnum クラスのインスタンスであるオブジェクト '1' への参照です。'1' オブジェクトは、インスタンス変数を含まない Fixnum のインスタンスです。新しい「Dog」インスタンスへの参照と何ら変わりはありません。
x = Dog.new
同様に、 x はクラス Dog のインスタンスへの参照であると言えます。
class Dog
attr_accessor :legs # this defines the 'legs' and 'legs=' methods!
end
x = Dog.new
x.instance_variables
=> [] # if you would assign legs=4 during "initialize", then it would show up here
x.legs = 4 # this is really a method call(!) to the 'legs' method
x.instance_variables # get created when they are first assigned a value
=> [:legs]
そのような参照をメソッド呼び出しに渡すか、別のクラスに渡すか、それ自体で評価するかは問題ではありません。Ruby はそれがオブジェクト参照であることを認識しており、オブジェクトの内部と継承チェーンを調べて問題を解決します。
メソッド名の解決
それは部分的な真実でした:) を解釈するときx.legs
、Rubyはオブジェクトのクラス継承チェーンにその名前「legs」に応答するメソッドがあるかどうかをチェックします。同じ名前のインスタンス変数に魔法のようにアクセスしているわけではありません!
「attr_reader :legs」または「attr_accessor :legs」を実行するか、メソッドを自分で定義することにより、「legs」メソッドを定義できます。
class Dog
def legs
4 # most dogs have 4 legs, we don't need a variable for that
end
end
x.legs # this is a method call! it is not directly accessing a :legs instance variable!
=> 4
x.instance_variables
=> [] # there is no instance variable with name ":legs"
メソッドとインスタンス変数として実装しようとすると、これが起こります: :)
class Dog
attr_accessor :legs # this creates "def legs" and "def legs=" methods behind the scenes
def legs # here we explicitly override the "def legs" method from the line above.
4
end
end
x = Dog.new
x.legs # that's the method call we implemented explicitly
=> 4
x.legs = 3 # we can still assign something to the instance_variable via legs=
=> 3
x.legs # the last definition of a method overrides previous definitions
# e.g. it overrides the automatically generated "legs" method
=> 4
attr_accessor :legs
これを行うための簡単な表記法は次のとおりです。
class Dog
def legs
@legs
end
def legs=(value)
@legs = value
end
end
インスタンス変数が自動的にアクセスされる魔法の方法はありません。それらは常にメソッドを介してアクセスされ、後でオーバーライドできます。
それがあなたにとって理にかなっていることを願っています