我有一个函数foo
,它将另一个函数(比如bar
)作为参数。有没有办法将bar
的函数名称作为foo
内的字符串?
答案 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
,但也知道它委派给它的东西的名字。