leaning diary Rails

【Learning Daily24】Rubyの復習・変数と定数

【Learning Daily24】Rubyの復習・変数と定数

変数と定数

Rubyの変数と定数は、最初の1文字によって区別されます。

 

変数と定数の種別は、ローカル変数、インスタンス変数、クラス変数、グローバル変数、定数のいずれかです。

 

変数の場合は通常、2文字目以降は英数字もしくはアンダースコアです。

(組み込み変数の一部に例外があります。)

 

変数名の長さにメモリのサイズ以外の制限はありません。

 

ローカル変数

小文字またはアンダースコアで始まる識別子は、ローカル変数またはメソッド呼び出しです。

 

ローカル変数のスコープ内において、小文字で始まる識別子への最初の代入は、すなわちそのスコープに属するローカル変数の宣言になります。

 

宣言されていない識別子の参照は、引数のないメソッド呼び出しとみなされます。

 

ローカル変数のスコープは、宣言した位置からその変数が宣言されたブロック、メソッド定義、またはクラスかモジュール定義の終わりまでです。

トップレベルのローカル変数であれば、プログラムの終了まで有効です。

 

手続きオブジェクト化された場合は、例外としてそのブロックオブジェクトが消滅するまで存在します。

 

同じスコープを参照する手続きオブジェクト間では、ローカル変数は共有されます。

 

参照:手続きオブジェクトの挙動の詳細 Rubyリファレンス

 

参照: 10. ブロックと手続きオブジェクト

 

インスタンス変数

「@」で始まる変数がインスタンス変数です。

 

インスタンス変数は特定のオブジェクトに所属していて、クラス(またはサブクラス)のメソッドをとおして参照できます。

 

初期化(initialize)されていないインスタンス変数を参照したときの値は「nil」です。

 

以下は一例です。

 

class Foo
  def initialize
    @x= 1
  end
  def x
    @x
  end
  def y
    @y
  end
end

class Buzz < Foo
  def zzz
    @x
  end
end

 

irbで実行すると以下の結果になります。

1
=> 1
>> p Foo.new.y
nil
=> nil
>> p Buzz.new.zzz
1
=> 1

 

クラス変数

「@@」で始まる変数はクラス変数です。

 

クラス変数はクラス定義の中で定義され、クラスの特異メソッド、インスタンスメソッドなどから参照したり、代入したりできます。

 

クラス変数では、そのクラスのほか、サブクラス、それらのインスタンスまで有効です。

 

また、モジュールで定義されたクラス変数(モジュール変数)はそのモジュールをインクルードしたクラス間でも共有されます。

 

なお、クラスの外から直接参照することができません(継承されたクラスからは参照や代入も可能です)。

 

グローバル変数

「$」で始まる変数はグローバル変数です。

 

宣言は不要で、初期化されていないグローバル変数を参照したときの値はnilです。

 

プログラムのどこからでも参照できますが、その分利用には注意を要します。

 

疑似変数

疑似変数は、値を変更することができない特殊な変数です。

 

疑似変数へ代入すると文法エラーがおきます。

 

例)

self 現在のメソッドの実行の主体です。

nil Nilクラスの唯一のインスタンスです。

true Trueクラスの唯一のインスタンスです。

false Falseクラスの唯一のインスタンスです。nilとfalseは偽を表します。

__FILE__ 現在のソースファイル名です。

フルパスが必要な場合は、File.expand_path(__FILE__)とします。

__LINE__ 現在のソースファイル中の行番号。

 

定数

 

アルファベット大文字「A-Z」で始まる識別子が定数です。

 

定数の定義と初期化は代入によります。

 

定数はメソッドの中では定義できず、1度定義された定数に再度代入を行おうとすると警告メッセージが表示されます。

 

定義されていない定数にアクセスする場合は、例外NameErrorが発生します。

 

なお、クラスの定義では、クラスオブジェクトの生成と同時に、名前がクラス名である定数が初期化されたかたちになっています。

つまり、クラス名を参照することは、文法上は定数の参照と同じです。

 

定数参照時の定数の探索順序は以下のとおりです。

 

1.ネスト関係を外側に向かって探索

2.継承系を上位に向かって探索

 

トップレベルの定数定義はネストの外側とはみなされないため、継承関係を探索した結果で参照されます。つまり優先順位は低くなります。

 

-leaning diary, Rails
-