5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Rubyの実行コンテキスト

Posted at

実行コンテキストとは

実行コンテキストとは、プログラムの実行時の文脈や環境のことを言います。
その実行時にどのような変数やメソッドが定義されていて、スコープはどうなっているのかなどです。

Rubyの場合、プログラムを実行するとmainというオブジェクトが生成され、これがトップレベル、グローバルの実行コンテキストになります。(※ mainObjectクラスのインスタンス)
したがって、Rubyにおいてプログラムは、mainというグローバルコンテキストの中で実行されるということになります。

irbを起動してselfと入力すると、mainが返ってきますが、これはmainというコンテキストで実行されるということです。

  irb(main):001:0> self
  => main

クラス定義やインスタンスを作成すると、実行コンテキストが作成されます。

Binding

RubyではBindingクラスによって、上記で説明した実行コンテキストをオブジェクトとして持つことができます。
bindingメソッドを実行するとその実行コンテキストのオブジェクトを生成します。

  irb(main):001:0> b = binding
  => #<Binding:0x00000001008ba668>

class定義やインスタンス生成によって作成された実行コンテキストも以下のようにbindingメソッドによってオブジェクト化することができます。

  class Hoge
    def self.class_binding
      binding
    end
    def instance_binding
      binding
    end
  end

  cb = Hoge.class_binding
  ib = Hoge.new.instance_binding
  puts cb, cb.receiver
  # => #<Binding:0x0000000102e60d40>
  # => Hoge
  puts ib, ib.receiver
  # => #<Binding:0x0000000102e60b60>
  # => #<Hoge:0x0000000102e60ca0>

トップレベル、グローバルの実行コンテキストのオブジェクトは定数になっていて、TOPLEVEL_BINDINGで参照することができます。

  irb(main):001:0> b = TOPLEVEL_BINDING
  => #<Binding:0x0000000109ddcca0>

eval

evalメソッドでは、このBindingオブジェクトを指定することによって、評価のコンテキストを変えることができます。

  @x = 'global'

  class Hoge
    def initialize(x)
      @x = x
    end

    def self_binding
      binding
    end
  end

  hoge = Hoge.new('instance')
  instance_binding = hoge.self_binding

  eval("puts @x", TOPLEVEL_BINDING)
  # => global
  eval("puts @x", instance_binding)
  # => instance

1つ目のevalは第2引数にTOPLEVEL_BINDINGを渡しているため、第1引数のscriptをTOPLEVEL_BINDINGの実行コンテキストで評価しています。
そのため、インスタンス変数@xは、グローバルコンテキストのインスタンス変数を参照します。

2つ目のevalは第2引数にインスタンス生成によって生成された実行コンテキストのオブジェクトを渡しているため、その実行コンテキストで評価されています。この場合、生成されたインスタンスのインスタンス変数@xを参照します。

参考記事

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?