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