【问题标题】:Scala - get function nameScala - 获取函数名称
【发布时间】:2011-10-06 07:04:33
【问题描述】:

我有一个函数foo,它接受另一个函数(比如bar)作为参数。有没有办法将bar 的函数名作为字符串在foo 中获取?

【问题讨论】:

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

标签: scala


【解决方案1】:

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

所以,当你这样做时:

def foo() {}

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

bar(foo)

最后一次调用中实际发生的是:

bar(() => foo())

不过,理论上,您可以找到所传递的函数对象正在包装的方法的名称。你可以做字节码自省来分析上面方法bar中的函数对象fapply方法的主体,并据此推断方法的名称是什么。然而,这既是一种近似值,也是一种过度杀伤力。

【讨论】:

    【解决方案2】:

    我已经进行了相当深入的研究,但我认为没有。函数对象上的toString 只是说例如<function1>,它的类是编译器生成的合成类,而不是其中包含method 对象的东西,您可以查询。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-11
      • 2014-01-15
      • 1970-01-01
      • 1970-01-01
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多