【发布时间】:2023-04-09 03:44:01
【问题描述】:
假设我有一些调用 Java 库的 Scala 代码,该库使用 _ 作为标识符(我确实这样做了——说来话长)。这是一个简化的示例:
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.`_`
^
这是由于 a change 出现在 2.10.1 中并修复了 this issue。来自提交消息:
禁止
_作为标识,只会带来坏处。
嗯,当然,但我不知道为什么这意味着我无法逃脱它——我认为这就是反引号的用途。
我是否必须编写一个 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 评论中出现反引号,我不知道如何。) -
Every change breaks someone's workflow。你应该报告这个错误,或者可能重新打开旧的,因为修复很糟糕。在我看来,他们需要修复别名代码,而不是不允许
_作为标识符。就像您指出的那样,这会破坏 Java iterop,这肯定比修复解决的原始问题更糟糕...... -
@RandallSchulz
`← 我有一个!看到这个元问题:Backslash escaping in code regions in comments -
@DaoWen:谢谢!现在我知道了。