Rubyの変数は大きく以下の5種類あり、変数名の書き方でその種類が決定されます。

グローバル変数を定義する

変数をグローバル変数として定義したい場合、$varのように先頭を$で始めます。グローバル変数はスコープに関係なく、スクリプト中のどこからでも参照や更新をすることができます。

 $var = 10
 
 def sample
   p $var #=> 10
 end
 
 p $var #=> 10

インスタンス変数を定義する

インスタンス変数はクラスから生成されたインスタンス(オブジェクト)毎に別の値を持つことができる変数で、通常、各オブジェクトの状態を表すために使用されます。

@varのように変数名を@で始めるとインスタンス変数として定義されます。

 class Sample
   def initialize(width = 100, height = 100)
     @width = width
     @height = height
   end
   attr_accessor :width, :height
 end
 
 sample = Sample.new(150, 250)
 
 p sample.width #=> 150
 p sample.height #=> 250

クラス変数を定義する

クラス変数はそのクラスの全てのインスタンスで共有される変数で、@@varのように変数名を@@で始めるとクラス変数として定義されます。

 class Sample
   @@cvar = 0
   def initialize(width = 100, height = 100)
     @width = width
     @height = height
   end
 
   def cvar; @@cvar; end
   def cvar=(x); @@cvar = x; end
   attr_accessor :width, :height
 end
 
 sample = Sample.new(150, 250)
 sample.cvar = 300
 
 sample1 = Sample.new(10, 20)
 
 p sample.width #=> 150
 p sample1.width #=> 10
 p sample.cvar #=> 300
 p sample1.cvar #=> 300

ローカル変数を定義する

ローカル変数はメソッド内などの特定の範囲でのみ使用される変数で、小文字のアルファベットで始まる名前で始めるとローカル変数として定義されます。

ローカル変数は定義されたスコープの中でのみ有効です。下の例では1行目のvarとSample#initializeのvarでは別の変数として扱われます。

 var = 0
 
 class Sample
   def initialize
     var = 1
   end
 end
 
 Sample.new
 
 p var #=> 0

擬似変数

通常の変数以外に擬似変数と呼ばれる特殊な変数があります。

self
現メソッドのオブジェクトそのもの
nil
NilClass?クラスの唯一のインスタンス
true
TrueClass?クラスの唯一のインスタンス。真の代表値
false
FalseClass?クラスの唯一のインスタンス。偽を表す
__FILE__
現在のソースファイル名を表す
__LINE__
現在のソースファイル中の行番号を表す