18

を識別子として使用する 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.`_`
                        ^

これは、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 ヘルパー ソリューションほど恐ろしいものではないかどうかはわかりません。

4

1 に答える 1