メタプログラミング ruby ローカル変数スコープ
ローカル変数のスコープ切り替え
ローカル変数を使う時にいつも気になるのがスコープの存在です。
一旦、スコープの切り替えタイミングは クラス定義 モジュール定義 メソッド定義 の3つです。 上記3つのことを「スコープゲート」と呼びます。
v1 = 1 #→v1 class MyClass v2 = 2 #→ v2 p local_variables def my_method v3 = 3 #→ v3 p local_variables end p local_variables #→ v2 end obj = MyClass.new obj.my_method.local_variables
スコープゲートを抜けるには?
クラス定義やメソッドを乗り越えて、ローカル変数を使いたい時があると思います。
クラス定義の場合
class.newを用いてインスタンスを作成して、クラス定義のスコープゲートを回避します。
v1 = 1 MyClass = Class.new do puts "クラス定義の中#{v1}" end
メソッド
メソッドの際は動的メソッドを用います。
v1 = 1 MyClass = Class.new do puts "クラス定義の中#{v1}" define_method :my_method do "クラス定義の中#{v1}" end end
フラットスコープ
スコープゲート(クラス定義・モジュール定義・メソッド)をメソッド呼び出しに変更すると スコープ変更せず、他の変数が見えることが出来ます。
これを スコープのフラット化 または フラットスコープ と呼びます。