Scala - получить имя функции - PullRequest
11 голосов
/ 06 октября 2011

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

Ответы [ 2 ]

14 голосов
/ 06 октября 2011

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

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

def foo() {}

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

bar(foo)

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

bar(() => foo())

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

1 голос
/ 06 октября 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...