Scala - получить имя функции

У меня есть функция foo, которая принимает в качестве параметра другую функцию (например, bar). Есть ли способ получить имя функции bar как строку внутри foo?

Ответ 1

Нет. См. разница между методами и функциями. Методы не передаются в качестве параметров под капотом - они передаются в функциональные объекты при передаче другому методу/функции. Эти функциональные объекты являются экземплярами анонимных, генерируемых компилятором классов и не имеют имени (или, по крайней мере, являются анонимными классами, имеют какое-то искаженное имя, доступ к которому можно получить с помощью отражения, но, вероятно, не нужно).

Итак, когда вы это сделаете:

def foo() {}

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

bar(foo)

что происходит в последнем вызове:

bar(() => foo())

Теоретически, однако, вы можете найти имя метода, в котором объект функции, который вы передаете, является обертыванием. Вы можете сделать интроспекцию байт-кода, чтобы проанализировать тело метода apply объекта функции f в методе bar выше и заключить на основании этого, что имя метода. Однако это как аппроксимация, так и избыток.

Ответ 2

У меня было довольно копаться, и я не думаю, что это так. toString в функциональном объекте просто говорит, например, <function1>, и его класс является синтезированным классом, сгенерированным компилятором, а скорее чем-то с объектом method внутри него, который вы можете запросить.

Я предполагаю, что если вам это действительно нужно, вам нечего будет прекратить внедрять function с чем-то делегированным, но также знать имя вещи, на которую оно делегировалось.