変数と定数の種別は変数名の最初の一文字によって、ローカル変数、インスタンス変数、クラス変数、グローバル変数、定数のいずれかに区別されます。_ですが、組み込み変数の一部には「`$'+1文字の記号」という変数があります(組み込み変数を参照)。変数名の長さにはメモリのサイズ以外の制限はありません。例:foobar小文字または`_'で始まる識別子はローカル変数またはメソッド呼び出しです。ローカル変数スコープ(クラス、モジュール、メソッド定義の本体)における小文字で始まる識別子への最初の代入はそのスコープに属するローカル変数の宣言になります。宣言されていない識別子の参照は引数の無いメソッド呼び出しとみなされます。ローカル変数のスコープは、宣言した位置からその変数が宣言されたブロック、メソッド定義、またはクラス/モジュール定義の終りまでです。寿命もそのブロックの終りまで(トップレベルのローカル変数はプログラムの終了まで)ですが、例外としてブロックが手続きオブジェクト化された場合は、そのオブジェクトが消滅するまで存在します。同じスコープを参照する手続きオブジェクト間ではローカル変数は共有されます。1宣言は、例え実行されなくても宣言とみなされます。例:@foobar`@'で始まる変数はインスタンス変数であり、特定のオブジェクトに所属しています。インスタンス変数はそのクラスまたはサブクラスのメソッドから参照できます。初期化されていないインスタンス変数を参照した時の値はnilです。endend@@で始まる変数はクラス変数です。クラス変数はクラス定義の中で定義され、クラスの特異メソッド、インスタンスメソッドなどから参照/代入ができます。クラス変数と定数の違いは以下の通りです。再代入可能(定数は警告を出す)クラスの外から直接参照できない(継承されたクラスからは参照/代入可能)クラス変数はクラス自身のインスタンス変数とは以下の点で異なります。サブクラスから参照/代入が可能インスタンスメソッドから参照/代入が可能クラス変数は、そのクラスやサブクラス、それらのインスタンスで共有されるグローバル変数であるとみなすことができます。3endモジュールで定義されたクラス変数(モジュール変数)は、そのモジュールをインクルードしたクラス間でも共有されます。3end親クラスに、子クラスで既に定義されている同名のクラス変数を追加した場合には、子クラスのクラス変数が上書きされます。式のボディをスコープとして持ちます。