У меня есть функция foo, которая принимает в качестве параметра другую функцию (например, bar). Есть ли способ получить имя функции bar как строку внутри foo?
Scala - получить имя функции
Ответ 1
Нет. См. разница между методами и функциями. Методы не передаются в качестве параметров под капотом - они передаются в функциональные объекты при передаче другому методу/функции. Эти функциональные объекты являются экземплярами анонимных, генерируемых компилятором классов и не имеют имени (или, по крайней мере, являются анонимными классами, имеют какое-то искаженное имя, доступ к которому можно получить с помощью отражения, но, вероятно, не нужно).
Итак, когда вы это сделаете:
def foo() {}
def bar(f: () => Unit) {}
bar(foo)
что происходит в последнем вызове:
bar(() => foo())
Теоретически, однако, вы можете найти имя метода, в котором объект функции, который вы передаете, является обертыванием. Вы можете сделать интроспекцию байт-кода, чтобы проанализировать тело метода apply объекта функции f в методе bar выше и заключить на основании этого, что имя метода. Однако это как аппроксимация, так и избыток.
Ответ 2
У меня было довольно копаться, и я не думаю, что это так. toString в функциональном объекте просто говорит, например, <function1>, и его класс является синтезированным классом, сгенерированным компилятором, а скорее чем-то с объектом method внутри него, который вы можете запросить.
Я предполагаю, что если вам это действительно нужно, вам нечего будет прекратить внедрять function с чем-то делегированным, но также знать имя вещи, на которую оно делегировалось.