DesignAssembler

備忘録に近い

Rubyのスコープ

スコープ

スコープとは、変数の見える範囲のことです。

普通にプログラムを書いてると分かると思います。

module ModuleScope
  class ClassScope1
    def self.method_scope1
      var1 = 1
      #var1はローカル変数
    end

    def self.method_scope2
      @var2 = 2
      #@var2はインスタンス変数
      puts var1
      #ここではvar1は見えない(スコープの外にある)
    end
  end

  class ClassScope2
    #このクラスではvar1、@var2は見えない
    def self.method_scope3
      puts @var2
    end
  end
end

> ModuleScope::ClassScope1.method_scope2
NameError: undefined local variable or method `var1' for ModuleScope::ClassScope1:Class

各変数のスコープ

グローバル変数を使うより、mainオブジェクトのインスタンス変数にする方がいいです。

mainオブジェクトはトップレベルのオブジェクトで、irbでselfと打つとmainと出ます。

スコープゲート

スコープを変更する以下の3つのキーワードをスコープゲートと呼びます

  • class
  • module
  • def

rubyは上のキーワードを見つけるとスコープを切り替えます。

フラットスコープ

上のスコープゲートを使わなければスコープを取り払うことができます。

つまり、クラス作成にはClass.new()、メソッド作成にはdefine_method()メソッドを使います。

var1 = 1
ClassScope1 = Class.new() do
    puts var1
    var2 = 2
    define_method(:method_scope1) do
      puts var2
    end
end

> ClassScope1.new.method_scope1
 => 2

スコープが取り払われました。

参考

qiita.com

メタプログラミングRuby 第2版

メタプログラミングRuby 第2版