tamaño - panel de texto java
Escapar subrayado para la interoperabilidad de Java en Scala (1)
Dado que los backticks son el mecanismo para la interoperabilidad de Java en los identificadores ( por ejemplo, Thread.yield()
), dudo que exista otra forma sin usar Reflection. Yo diría que su mejor apuesta (hasta que se solucione el error) es escribir un método auxiliar estático en Java para acceder al _
.
Sé que esto es totalmente ridículo, pero probablemente sea mejor que usar la reflexión. Rompieron la interoperabilidad de Java con ese parche, por lo que tendrán que abordar este problema con el tiempo. Hasta que lo hacen, sin embargo, creo que está roto.
Supongamos que tengo un código Scala que llama a una biblioteca de Java que usa _
como identificador (y lo hago, es una larga historia). Aquí hay un ejemplo simplificado:
public class StupidUnderscore {
public static String _() { return "Please give me a real name!"; }
}
No hay problema, ¿verdad? Sólo escápalo:
scala> StupidUnderscore.`_`
res0: String = Please give me a real name!
Y esto siempre ha funcionado, hasta que intenté actualizar a Scala 2.10.2 esta mañana:
scala> StupidUnderscore.`_`
<console>:1: error: wildcard invalid as backquoted identifier
StupidUnderscore.`_`
^
Esto se debe a un cambio que apareció en 2.10.1 y corrige este problema . Desde el mensaje de confirmación:
Prohibir
_
como identificador, solo puede traer maldad.
Bueno, claro, pero no sé por qué eso significa que no puedo escapar, pensé que para eso eran las cotizaciones.
¿Voy a tener que escribir un contenedor de Java para que esto funcione? ¿Hay alguna otra forma de referirme al método _
una biblioteca de Java en Scala?
Como nota al pie, he confirmado que es posible solucionar este problema sin escribir ningún nuevo 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
}
Y entonces:
scala> AwfulMacroHack.`I''m not named _!`
res0: String = Please give me a real name!
Sin embargo, no estoy seguro de que esto sea menos horrible que la solución de ayuda de Java.