Ruby 元编程访问局部变量

Ruby 元编程访问局部变量,ruby,metaprogramming,Ruby,Metaprogramming,是否有可能获取这些局部值(类外)?否。一旦局部变量超出范围(对于运行了初始化方法的条形-对于fiz达到类定义的结束时),它就消失了。没有留下任何痕迹 当局部变量仍在范围内时,您可以使用local\u variables查看它(好吧,它的名称),并使用eval获取和设置它的值(尽管出于理智的原因,绝对不建议这样做),但一旦它超出范围,就是这样。无法将其取回。初始化中的局部变量将丢失 您可以在类外部获取值fiz,但只有在定义该类并记录该类定义的返回时才能获取该值 return\u of_class\

是否有可能获取这些局部值(类外)?

否。一旦局部变量超出范围(对于运行了
初始化
方法的条形-对于
fiz
达到类定义的
结束
时),它就消失了。没有留下任何痕迹


当局部变量仍在范围内时,您可以使用
local\u variables
查看它(好吧,它的名称),并使用
eval
获取和设置它的值(尽管出于理智的原因,绝对不建议这样做),但一旦它超出范围,就是这样。无法将其取回。

初始化中的局部变量将丢失

您可以在类外部获取值fiz,但只有在定义该类并记录该类定义的返回时才能获取该值

return\u of_class\u definition=(class A;fiz=5;end)
将fiz的值分配给变量

您也可以使用
绑定
,但当然,这意味着更改类,这可能不允许用于练习

class Foo
  def initialize
    bar = 10
  end
  fiz = 5
end

在ruby中,我们可以称之为作用域门——用ruby编写的程序离开前一个作用域的地方。这些门是:
class
module
和method(
def
关键字)。换句话说,在
class
之后,
def
关键字的
module
,您将立即进入一个新范围

在ruby中,嵌套可见性不会发生,一旦创建新的作用域,以前的绑定将被一组新的绑定替换

例如,如果定义以下类:

class A
  bin = 15
  $binding = binding
end

p eval 'bin', $binding
local\u变量
方法调用将返回
[:y]
。这意味着我们无法访问
x
变量。您可以使用ruby的称为平面作用域的技术来解决这个问题。基本上,您可以使用
class.new
定义一个类,然后将一个块传递给这个调用。显然,块可以从定义它的范围中获取任何局部变量,因为它是一个闭包

我们前面的示例可以改写为:

x = 1
class MyClass
  # you can't access to x from here
  def foo
    # ...from here too
    y = 1
    local_variables
  end
end

在这种情况下,
local\u变量
将返回
[:x,:y]

注意,这只起作用,因为
fiz=5
恰好是类body.vgoff中的最后一个表达式?那很熟悉。可以使用类似的技术来获取“bar”的值:类SonOfFoo请忽略我刚才留下的大部分注释。(编辑问题。)要获取“bar”,请创建包含def initialize()put super的Foo子类;结束。完全是@sepp2k,在这种情况下,感觉像是编程受到了副作用,对吗?与方法中返回的更为接受的“最后一个已评估语句”不同。但是“知道规则,所以你知道如何打破规则。”哇,那真的很可怕。我不敢尝试这样的事情。你是不是把
局部变量
@instance\u变量
混在一起了?当然,这只是ruby元编程课程的一个练习
x = 1
Foo = Class.new do
  define_method :foo do
    i_can_do_something_with(x)
    y = 1
    local_variables
  end
end