Вы можете наблюдать манипуляции символов:
$ scala -Yshow-syms -uniqid -Dscala.repl.maxprintstring=8000
В РЕПЛ, предупреждают, вы увидите одну пачки продукции для завернутой коды, а затем второй стопу выхода для бита кода, который печатает ваш результат.
scala> def m1: String => String = s => s
[[symbol layout at end of parser]]
* package scala#22 (final)
[[symbol layout at end of namer]]
* object $read#58183
* package $line6#58181 (final)
package scala#22 (final)
[[symbol layout at end of packageobjects]]
object $read#58183
package $line6#58181 (final)
package scala#22 (final)
[[symbol layout at end of typer]]
* class String#643 (final)
* constructor Object#3505
* object $read#58184
* constructor $read#58188
* object $iw#58190
* constructor $iw#58192
* object $iw#58193
* object $iw#58194
* constructor $iw#58196
* method m1#58197
* value $anonfun#58199 (<synthetic>)
* value s#58200
... массивный надрез ...
object $iw#58194
constructor $iw#58196
method m1#58197
<$anon: Function1#2093> (final <synthetic>)
constructor $anonfun#58218
[[symbol layout at end of lambdalift]]
... чик ...
object $iw#58194
O <$anon: Function1#2093> [Owner was method m1#58197, now object $iw#58194] (final <synthetic>)
constructor $anonfun$m1$1#58218
Как говорит выход, то anonfun становится дочерним объемлющего класса потому что он реализуется как класс; любые захваченные переменные передаются его конструктору.
Быстрый просмотр LambdaLift.scala
показывает, что newName
фактически special-cases anonymous functions that are owned by methods, чтобы иметь название, которое вы указали.
Это простой способ избежать конфликтов имен, таких как:
scala> class Foo { def x = 1 to 10 map (2 * _) ; def y = 1 to 10 map (3 * _) filter (_ > 6) }
Но поскольку newName
получает свежее имя в любом случае, я бы предположил, что сохранение имени метода является доводка помощь.
Хорошая ли отладочная помощь?
Несколько анонимных в любом методе 'm' в компиляционной единице будут называться anonfun$m$1
и так далее; нет способа отличить, принадлежал ли anonfun$m$3
Foo.m
или Bar.m
, за исключением проверки этих классов.
Я бы положился на REPL, чтобы открыть для меня anonfuns, за исключением того, что в настоящее время он не умнее, чем мы.