【发布时间】:2016-10-12 01:46:22
【问题描述】:
在 Ruby 中是否可以使用元编程从方法外部获取方法内部定义的所有局部变量名称?
def foo
var = 100
arr = [1,2]
end
类似foo.local_variables。
我只需要检索变量名,而不是它们的值。
我为什么要查找这些变量名:我有一个类,我想为在“#initialize”中初始化的所有实例变量动态生成设置器。
为了做到这一点,在“初始化”中,我使用了类似instance_variables.each do |inst_var_name| define_singleton_method(...) do ...
这很有效:每个实例化对象都将其设置器作为单例方法。但是,我正在寻找一种解决方案,我可以从“initialize”方法之外读取实例变量名称,以便能够为它们使用“#define_method”,并创建常规方法而不是单例方法。
【问题讨论】:
-
不,这是不可能的。与只要对象存在就存在的实例变量不同,局部变量在方法被调用之前不存在,并且在方法返回后立即停止存在。没有“方法内”和“方法外”;只有“方法正在执行时”和“方法未执行时”。你想解决什么问题?
-
如果可能的话,ruby 应该在运行时保留多少元数据?他们将占用多少内存?这是不可行的。
-
@Jordan 我不同意。我不是想获取局部变量的值,只是它们的名称。由于可以获得方法的源代码,我想知道是否还有一些方法可以获取方法中定义(或试图定义)的局部变量的名称......有意义吗?跨度>
-
虽然您的问题的答案是“否”,但如果将
p local_variables行添加到foo,执行foo将导致显示[:var, :arr]。 -
...虽然解析方法也会让你失败,例如
define_method或instance_eval("def ...")。您还没有告诉我们您要解决什么问题。
标签: ruby scope metaprogramming