Ruby:从块中检索local_variables或在块中追加代码

时间:2013-06-08 21:38:38

标签: ruby scope metaprogramming block dsl

我希望访问我的DSL用户在一个块中声明的局部变量。

E.g。

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

1 个答案:

答案 0 :(得分:0)

如果您认为在eval中将某些内容传递给local_variables方法,为了证明该变量不再存在,这不是代码中发生的事情。

局部变量确实是局部变量,因此范围会发生变化,当范围发生变化时,范围变化的局部变量与您在另一个范围内所看到的变量不同。

要获取这些局部变量,您必须处于该上下文中。 Self必须是该对象,然后您才能访问这些局部变量。

因此,在这些区域中不再存在名为“变量”的变量,因为该变量从未存在于您所在的范围内。

本地变量并不意味着长寿,真的。

现在怎么去找他们?您可以通过将其作为方法的最后一次评估来获取内容。