从方法外部获取在方法内定义的局部变量名称
是否有可能在Ruby中使用元编程从方法外部获取在方法内定义的所有局部变量名称?
def foo
var = 100
arr = [1,2]
end
像foo.local_variables。
我只需要检索变量名称,而不是它们的值。
为什么我试图找到这些变量名称 :我有一个类,我想动态地为所有在“#initialize”中初始化的实例变量生成setter。
为了做到这一点,在“初始化”内部,我使用了类似instance_variables.each do |inst_var_name| define_singleton_method(...) do ...
instance_variables.each do |inst_var_name| define_singleton_method(...) do ...
这是有效的:每个实例化对象都将它的setter作为单例方法。 然而,我正在寻找一种解决方案,我可以从“initialize”方法外部读取实例变量名称,以便能够为它们使用“#define_method”,并创建常规方法而不是单例方法。
您可以(重新)分析该方法并检查S-EXPR树。 请参阅下面的概念证明。 您可以使用Method#source_location
定义该方法的文件,然后读取该文件。 我的代码当然有改进的余地,但应该让你开始。 它是一个功能完整的代码片段,只需要ruby解析器gem(https://github.com/whitequark/parser)。
require 'parser/current'
node = Parser::CurrentRuby.parse(DATA.read) # DATA is everything that comes after __END__
def find_definition(node, name)
return node if definition_node?(node, name)
if node.respond_to?(:children)
node.children.find do |child|
find_definition(child, name)
end
end
end
def definition_node?(node, name)
return false if !node.respond_to?(:type)
node.type == :def && node.children.first == name
end
def collect_lvasgn(node)
result = []
return result if !node.respond_to?(:children)
node.children.each do |child|
if child.respond_to?(:type) && child.type == :lvasgn
result << child.children.first
else
result += collect_lvasgn(child)
end
end
result
end
definition = find_definition(node, :foo)
puts collect_lvasgn(definition)
__END__
def foo
var = 100
arr = [1,2]
if something
this = 3 * var
end
end
def bar
var = 200
arr = [3, 4]
end
你介意告诉我们为什么你想找到变量?
这些变量只在乔丹指出的时候存在,只有在方法正在执行时才存在,并且在之后立即丢弃。
如果你想要测试这些,你需要在方法内部完成。 该方法本身不允许这种反映。
链接地址: http://www.djcxy.com/p/25769.html上一篇: Getting local variable names defined inside a method from outside the method