2

IRB は、Ruby をいじってテストするための優れた方法です。次のように、スクリプトを使用してセットアップを行うこともできます。

require 'irb'

class Pirate
  def greet
    puts "Arrrrr, nice to meet ya"
  end
end

IRB.start # You can now instantiate Pirate in IRB

ただし、これを行うときの変数のスコープについては不明です。これらの行を前に追加するとIRB.start:

smithy     = Pirate.new
@blackbard = Pirate.new

... @blackbeardIRB で利用できるようになりますが、参照smithyするとundefined local variable or method 'smithy' for main:Object.

なんで?

4

1 に答える 1

6

コードの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

そして、現在のローカル変数にアクセスできるセッションを持っています。

于 2012-05-26T15:41:30.803 に答える