Scala - 获取函数名称

时间:2011-10-06 07:04:33

标签: scala

我有一个函数foo,它将另一个函数(比如bar)作为参数。有没有办法将bar的函数名称作为foo内的字符串?

2 个答案:

答案 0 :(得分:14)

没有。请参阅difference between methods and functions。方法不作为参数传递 - 它们在传递给其他方法/函数时被扩展为函数对象。这些函数对象是匿名的,编译器生成的类的实例,并且没有名称(或者,至少是匿名类,有一些可以使用反射访问的错误名称,但可能不需要)。

所以,当你这样做时:

def foo() {}

def bar(f: () => Unit) {}

bar(foo)

上次通话中实际发生的事情是:

bar(() => foo())

但从理论上讲,您可以找到正在传递的函数对象的包装方法的名称。您可以执行字节码内省来分析上面方法apply中函数对象f的{​​{1}}方法的主体,并根据该方法的名称得出结论。然而,这既是近似也是过度杀伤。

答案 1 :(得分:1)

我已经深入挖掘,我认为没有。函数对象上的toString只是说例如<function1>,它的类是由编译器生成的合成类,而不是你可能在其中查询的method对象。

我想如果你真的需要这个,就没有什么可以阻止你用委托的东西来实现function,但也知道它委派给它的东西的名字。