问题 Scala - 获取函数名称


我有一个功能 foo 这需要另一个功能(比如说 bar)作为参数。有没有办法获取函数名称 bar 作为一个字符串里面 foo


950
2017-10-06 07:04


起源

这个函数的“名称”究竟是什么意思? - agilesteel
假设我将名为bar的函数传递给foo。在foo里面,我通过参数调用baz接收这个函数。我想打印“bar”,即传入的函数的名称。 - jeffreyveon
我无法正确地理解可能引发这样一个问题的那种想法混乱。 - Tom Crockett
@agilesteel - 我基本上希望在传入的参数上执行类似toString的操作来获取“bar”。不要认为有可能看到其他答案.. - jeffreyveon
如果您描述了为什么要这样做,您可能会得到一些有用的替代解决方案。 - Jesper Nordenberg


答案:


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

所以,当你这样做时:

def foo() {}

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

bar(foo)

在最后一次通话中实际发生的事情是:

bar(() => foo())

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


14
2017-10-06 07:33





我有一个很好的挖掘,我不认为有。 toString 在函数对象上只是说例如 <function1>,它的类是由编译器生成的合成类,而不是带有的东西 method 你可能在其中查询的对象。

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


1
2017-10-06 07:45