我想在Ruby中做一些相当重的反思.我想创建一个函数,它返回调用堆栈上方各种调用函数的参数名称(只有一个更高就足够了,但为什么要停在那里?).我可以使用Kernel.caller,转到文件并解析参数列表,但这将是丑陋和不可靠的.
我希望的功能可以通过以下方式工作:
module A
def method1( tuti, fruity)
foo
end
def method2(bim, bam, boom)
foo
end
def foo
print caller_args[1].join(",") #the "1" mean one step up the call stack
end
end
A.method1
#prints "tuti,fruity"
A.method2
#prints "bim, bam, boom"
Run Code Online (Sandbox Code Playgroud)
我不介意使用ParseTree或类似的工具来完成这项任务,但是看看Parsetree,如何将它用于此目的并不明显.像这样创建一个C扩展是另一种可能性,但如果有人已经为我做了它会很好.
我可以看到我可能需要某种C扩展.我想这意味着我的问题是C扩展的哪种组合最容易起作用.我不认为来电者+ ParseTree本身就足够了.
至于为什么我想这样做,而不是说"自动调试",也许我应该说我想使用这个功能来自动检查函数的调用和返回条件:
def add x, y
check_positive
return x + y
end
Run Code Online (Sandbox Code Playgroud)
其中check_positive,如果将抛出一个异常,x而y不是积极的.显然,它会有更多,但希望这给了足够的动力.
可能重复:
在Ruby反射中获取参数名称
是否可以获取方法的参数名称?
示例:
def method_called(arg1, arg2)
puts my_method.inspect
end
Run Code Online (Sandbox Code Playgroud)
我想知道应该调用什么方法(my_method)来获得以下输出:
["arg1", "arg2"]
Run Code Online (Sandbox Code Playgroud)