メタプログラミング 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

フラットスコープ

スコープゲート(クラス定義・モジュール定義・メソッド)をメソッド呼び出しに変更すると スコープ変更せず、他の変数が見えることが出来ます。

これを スコープのフラット化 または フラットスコープ と呼びます。