コードのBinding
評価に使用される は次のように設定されていますirb/workspace.rb:51
(ここでは Ruby 1.9.3 rev 35410 を参照しています)。
@binding = eval("def irb_binding; binding; end; irb_binding",
TOPLEVEL_BINDING,
__FILE__,
__LINE__ - 3)
これは、IRB セッションがトップレベル メソッド内のコードと同じコンテキストで実行されることを意味します。観察:
puts "Outer object ID: %d" % self.object_id
puts "Outer binding: " + binding.inspect
smithy = Pirate.new
@blackbard = Pirate.new
def test
puts "Inner object ID: %d" % self.object_id
puts "Inner binding: " + binding.inspect
p @blackbard
p smithy
end
test
出力:
Outer object ID: 13230960
Outer binding: #<Binding:0x00000001c9aee0>
Inner object ID: 13230960
Inner binding: #<Binding:0x00000001c9acd8>
#<Pirate:0x00000001c9ada0>
/test.rb:18:in `test': undefined local variable or method `smithy' for main:Object (NameError)
...
オブジェクト コンテキスト ( self
) は、関数の内外で同じであることに注意してください。これは、すべての最上位メソッドがグローバルmain
オブジェクトに追加されるためです。
また、メソッドの内側と外側のバインディングが異なることに注意してください。Ruby では、すべてのメソッドに独自の名前スコープがあります。これが、IRB 内からローカル名にアクセスできない理由ですが、インスタンス変数にはアクセスできます。
正直なところ、IRB は Ruby ソフトウェアの最も輝かしい部分ではありません。私は通常、この種のものにPryを使用します。これを使用すると、次のことができます。
require 'pry'
binding.pry
そして、現在のローカル変数にアクセスできるセッションを持っています。