2010-04-18 16 views
13

Estoy escribiendo un DSL donde el operador "+" es estrictamente numérico, como algunos otros lenguajes populares. Está cerca, pero el operador String "+" está estropeando mis conversiones implícitas. ¿Cuál es la sintaxis para desimportar a un operador de la clase String?¿Cómo deseleccionar el operador String "+" en Scala?

Para que quede más claro, en lugar de esto:

 
scala> var x = "2" + 3; 
x: java.lang.String = 23 

Me gustaría obtener x: Int = 5

Imagino sólo necesito 2 cosas para que esto suceda:

  • Quitar (UNIMPORT dentro de mi alcance) la definición de "+" de Cuerdas
  • definir una conversión implícita de la cadena a Int

Estoy atascado en el primer paso.

Gracias

+2

Supongo que "importar scala.Predef. {Any2stringadd => _}" funcionaría. Pero no es así. Debe haber algo que extrañé. – Eastsun

+2

'any2stringadd' se usa cuando el lado izquierdo no admite el operador' + ', pero el lado derecho es una cadena. (Para ver esto en acción, ejecute 'scala -Xprint: typer' y ejecute' new Object + "ZZZZZ" ') Por el contrario,' "ZZZZZ" + new Object' puede usar el operador + que ya está definido en 'String', así que 'any2stringadd' no se usa. –

Respuesta

9

De acuerdo con la sección 12.3.1 de la Scala spec, el método para +String tiene un tratamiento especial por el compilador. No sé con certeza, pero creo que esto significa que no puede "quitarle importancia", lo cual es una lástima porque realmente rompe el sistema de tipos (al igual que el método relacionado toString).

¿Podría utilizar un nombre diferente para el operador en su DSL, por ejemplo, ++ o &?

+1

El hecho de que el método '+' obtenga un trato especial por parte del compilador no tiene nada que ver con si se puede importar o no. Se supone que el lenguaje es muy ortogonal y trata semánticamente a todos los métodos de clase, independientemente de si están sintetizados por el compilador o provistos por la biblioteca de tiempo de ejecución. –

+0

Estoy de acuerdo con lo que está diciendo si '+' se especifica explícitamente en la clase 'String', pero la especificación solo alude a esto, y se podría interpretar que IMO dice que hay una conversión implícita (que se procesa en el compilador y, por lo tanto, no puede ser "no importado") a algún tipo (por ejemplo, 'StringAdd'), que permite a los clientes tratar' Cadena' como si se hubiera definido con un método '+'. Me complace que se demuestre que estoy equivocado aquí, pero incluso a través del reflejo del tiempo de ejecución en 'String' (y' RichString'), no puedo encontrar un método '+' (es decir, '$ más'). –

+1

Gracias, suena como otro caso de "compilación mágica" que en realidad rompe la ortogonalidad y tiene interacciones inesperadas con otras características de lenguaje y bibliotecas. –

3

El método + para una cadena es un método en de la clase String (y por lo tanto en cada objeto de cadena), y como tal no se puede no importados.

1

No puede desimportarlo, pero puede usar +: y definirlo en la clase int. Lo mejor sería si lo escribe así: "2" .toInt + 3.

Cuestiones relacionadas