1

ブロック内の DSL のユーザーによって宣言されたローカル変数にアクセスしたい。

例えば

class Scraper
  def scrape!(&block)

    a = block.binding
    instance_eval &block
    b = block.binding

    p "b] Notice that the variable named variable no longer exists here..."
    eval("p local_variables", a)

    p "or here ..."
    eval("p local_variables", b)

    p "Although, when we rerun the proc, all is still as it was..."
    pr = block.to_proc
    pr.call
    c = pr.binding
    p "Still nothing here though..."
    eval("p local_variables", c)
  end
end

s = Scraper.new
s.scrape! do
  variable = "some_value"
  p "A] Notice that the variable named variable clearly exists here..."
  p local_variables
end
4

1 に答える 1

0

変数がもう存在しないことを示すために、eval で local_variables メソッドに何かを渡していると思われる場合、これはコードで起こっていることではありません。

ローカル変数は確かにローカルであるため、スコープが変更され、スコープが変更されると、スコープの変更にローカルなローカル変数は、別のスコープで見ているものとは異なります。

これらのローカル変数を取得するには、そのコンテキストにいる必要があります。Self はそのオブジェクトでなければならず、それらのローカル変数にアクセスできます。

したがって、「変数」と呼ばれる変数がそれらの領域に存在しなくなったわけではなく、その変数が現在のスコープに存在しなかったということです。

ローカル変数は、実際には長生きすることを意図していません。

今、それらに到達する方法は?メソッドの最後の評価にすることで、内容にたどり着くことができます。

于 2013-06-08T23:07:47.763 に答える