【问题标题】:Escaping underscore for Java interoperability in Scala为 Scala 中的 Java 互操作性转义下划线
【发布时间】: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:谢谢!现在我知道了。

标签: java scala


【解决方案1】:

由于反引号是 标识符上的 Java 互操作机制 (e.g. Thread.yield()),我怀疑是否有另一种不使用反射的方法。我想说你最好的选择(直到修复错误)是用 Java 编写一个静态帮助方法来访问_

我知道这完全是荒谬的,但它可能仍然比使用反射更好。他们用那个补丁破坏了 Java 互操作性,所以他们最终必须解决这个问题。然而,在他们这样做之前,我认为它只是坏了。

【讨论】:

  • 是的,这就是我害怕的。我已经对这个问题发表了评论,一旦我收到回复,我会重新打开。与此同时,我编辑了问题以添加另一个(同样荒谬的)临时解决方案(确实使用反射,但仅使用编译时反射)。
  • @TravisBrown - 我很惊讶宏解决方案有效。我原以为他们所做的编译器更改也会禁止newTermName("_")。尽管它看起来有点骇人听闻,但这可能比编写 Java 类要好。也许您甚至可以使用隐式值类将您的 `I'm not named _!` 属性添加到相关 Java 对象中。
猜你喜欢
  • 1970-01-01
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
  • 2012-03-15
  • 1970-01-01
  • 2012-04-11
  • 2013-04-11
相关资源
最近更新 更多