Предположим, что у меня есть код Scala, который вызывает библиотеку Java, которая использует _
как идентификатор (и я делаю - это долгая история). Здесь упрощенный пример:
public class StupidUnderscore {
public static String _() { return "Please give me a real name!"; }
}
Нет проблем, не так ли? Просто избегайте этого:
scala> StupidUnderscore.`_`
res0: String = Please give me a real name!
И это всегда срабатывало, пока я не попытался обновиться до Scala 2.10.2 сегодня утром:
scala> StupidUnderscore.`_`
<console>:1: error: wildcard invalid as backquoted identifier
StupidUnderscore.`_`
^
Это связано с изменением, которое появилось в 2.10.1 и исправлено этой проблемой. Из сообщения о фиксации:
Запретить
_
как идентификатор, он может только принести вред.
Ну, конечно, но я не знаю, почему это означает, что я не могу сбежать от этого - я думал, для чего нужны обратные запросы.
Мне нужно написать оболочку Java, чтобы заставить это работать? Есть ли другой способ я могу ссылаться на метод библиотеки Java _
в Scala?
Как сноска, я подтвердил, что можно обойти эту проблему без написания новой Java:
object AwfulMacroHack {
import scala.language.experimental.macros
import scala.reflect.macros.Context
def _impl(c: Context) = {
import c.universe._
c.Expr[String](
Select(Ident(newTermName("StupidUnderscore")), newTermName("_"))
)
}
def `I'm not named _!` = macro _impl
}
И затем:
scala> AwfulMacroHack.`I'm not named _!`
res0: String = Please give me a real name!
Я не уверен, что это менее ужасно, чем решение Java-помощника.