假设我有一些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包装器才能让其正常工作?还有其他办法可以在Scala中引用Java库的_
方法吗?
作为附注,我已经确认在不编写任何新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辅助程序解决方案更少可怕,虽然。
.
是可以接受的。显然没有任何问题…(如果在SO评论中可以出现反引号,我不知道如何操作)。 - Randall Schulz