我想在 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"
我不介意使用 ParseTree或用于此任务的一些类似工具,但查看 Parsetree,如何将其用于此目的并不明显。创建 C 扩展,如 this是另一种可能性,但如果有人已经为我做过,那就太好了。
我知道我可能需要某种 C 扩展。我想这意味着我的问题是哪种 C 扩展组合最容易工作。我不认为 caller+ParseTree 本身就足够了。
至于为什么我想这样做,而不是说“自动调试”,也许我应该说我想使用这个功能来自动检查函数的调用和返回条件:
def add x, y
check_positive
return x + y
end
如果 x
和 y
不是正值,check_positive
将抛出异常。显然,它的意义远不止于此,但希望这能提供足够的动力。
最佳答案
在 Ruby 1.9.2 中,您可以轻松获取任何 Proc
的参数列表(因此当然也可以获取任何 Method
或 UnboundMethod
) 与 Proc#parameters
:
A.instance_method(:method1).parameters # => [[:req, :tuti], [:req, :fruity]]
格式是一组符号对:类型(必需、可选、剩余、 block )和名称。
想要的格式,试试
A.instance_method(:method1).parameters.map(&:last).map(&:to_s)
# => ['tuti', 'fruity']
当然,这仍然不能让您访问调用者。
关于ruby - 如何使用反射获取参数名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/622324/