@@ で始まる変数はクラス変数。
クラス変数は、そのクラスやサブクラス、それらのインスタンスで共有されるグローバル変数であるとみなすことができます。
class Foo @@F = 0 def foo @@F += 1 print @@F, "\n" end end
@ で始まる変数はインスタンス変数。
class Foo @a = 123 # (1) def foo p @a # (2) ... 123でなくnilになる。 end end
(1)が「クラスのインスタンス変数」、(2)は「通常のインスタンス変数」。
(2)はクラスFooのインスタンスに属するのに対し、(1)はFooというクラスオブジェクト(Classのインスタンス)に属します。
インスタンスメソッドからクラスのインスタンス変数に直接アクセスすることはできません。
上のように初期化されていないインスタンス変数とみなされ、nilになります。
特異メソッドは特定のインスタンスに固有のメソッド。
以下のように使う。
foo = Foo.new def foo.hello print "Hello\n" end foo.hello
クラスにあるメソッドを追加したいが、わざわざサブクラスを作るほどのことでもない、といった場合に有効です。