【发布时间】:2010-10-11 23:04:20
【问题描述】:
我想在 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,如何将它用于此目的并不明显。创建像 this 这样的 C 扩展是另一种可能性,但如果有人已经为我完成了它会很好。
我可以看到我可能需要某种 C 扩展。我想这意味着我的问题是 C 扩展的哪种组合最容易工作。我不认为 caller+ParseTree 本身就足够了。
至于我为什么要这样做,与其说“自动调试”,也许我应该说我想使用这个功能来自动检查函数的调用和返回条件:
def add x, y
check_positive
return x + y
end
如果x 和y 不是正数,check_positive 会抛出异常。显然,它的意义远不止于此,但希望这能提供足够的动力。
【问题讨论】:
-
您似乎想确定执行顺序和参数。您是否有理由不能使用日志记录?您甚至可以进行一些元编程来打开类中的所有方法并自动记录参数以执行您想要的操作。
标签: ruby reflection