別のスコープのローカル変数をどうにか参照出来たらいいんだけど

毎度のirbrcに記述して、

selfのクラスとか、
requieしてるクラスや、
includeしてるモジュールや
定義されている変数情報とか表示するメソッド定義を追加。

若干改行用とか、罫線入れるのも追加した。

ただ、
ちょっと1箇所やりたいけど上手くいってないというか、
絶対無理なのではって問題に当たって苦悩中。

  #区切り線を出すための文字列を返す。 puts hrとかで利用
  def hr(count = 80, str = "-", between_blank = true)
    hr_str = ""
    hr_str << "\n" if between_blank
    hr_str << str.to_s * count
    hr_str << "\n\n" if between_blank
  end

  #特定行数の空行を入れる
  def blank_line(line_count = 1)
    line_count.times{ puts }
  end

  #irbで現在のself・self.classや、そのクラスに定義されている変数・定数などの情報を出す
  def self_info
    #実行するメソッド表示
    def info_title_output(call_method)
      puts "*** #{call_method} ***"
    end

    #メソッド実行、結果表示
    def result_output(call_method)
      print "#=> "
      p eval(call_method)
    end

    @self_class = self.is_a?(Class) ? self : self.class

    #テスト中
    inner_var = 1

    #call_methods
    %w(self
       self.class
       @self_class.ancestors 
       requires
       @self_class.included_modules
       @self_class.constants.sort
       @self_class.class_variables.sort
       self.instance_variables.sort
       local_variables.sort
    ).each do |call_method|
      info_title_output(call_method)
      result_output(call_method)
      blank_line(2)
    end

    return nil
  end


これで、
irb起動して、self_infoで色々出るんだけど、
local_variablesで表示する内容が、
このdef self_info 〜 endのメソッド内部のローカル変数になる。
よくよく考えれば当たり前ながら、スコープ違うもんなぁ。

どうにか黒魔術で、
irb起動して
a=1
b=2
c=3
とかしてローカル変数定義た後で、
メソッドの中からその定義されてるローカル変数の一覧を出せないかなー。

頑張って呼ぼうにもObjectのprivate_methodになってるから、
メソッドに引数でselfを渡したりしてもダメだし、
そもそも名前空間が違うんだから呼び出せるような構造になってちゃいけない気もするけれども、
Rubyならなんかやろうと思えば出来るんじゃないのって気もするけど、どうなのだろう。

というより、
案外すんなり出来るのに気付いてないだけとかだったりしないか…。




return eval("local_variables")
とかしたら、
戻ってから実行しないかなーなんて思っても、
戻り値だからevalで実行してから返すよなー、当たり前だよなーとなるし。


若干ムズムズ。

そんな当然無理な事を考えてんの?初心者?ww
とか言われたとしても、今日の考えてみる内容にする。


20:38
コメントで、行き着いた考えを追記した。記事編集で追記のほうがよかったかな・・・。