2010-03-20 14 views
11

Esto no es solo una broma ociosa ... Me pregunto si alguien sabe si hay un motivo de diseño real por el cual Scala no admite la interpolación similar a Groovy y otros "Javas sintácticamente mejores".¿Por qué no hay interpolación de cadenas en Scala?

p. Ej.

 
var str1 = "World"; 
var str2 = "Hello, ${str1}"; 
+0

Esta pregunta es similar a http://stackoverflow.com/ questions/2183503/substitute-values-in-a-string-with-placeholders-in-scala/2189134 con muchas respuestas diferentes. –

+0

@Mitch: Realmente no es la misma pregunta. El otro asker quería saber cómo hacerlo; Quería saber la razón detrás de la decisión de los diseñadores de Scala, que está bien respondida a continuación. –

+1

Ahora está (Interpolación de cadenas Scala 2.10): 's" Hola, $ str1 "' (http://docs.scala-lang.org/overviews/core/string-interpolation.html) –

Respuesta

16

La solución propuesta es omitir espacios cuando se usa +.

"a="+a+", b="+b 

Ha sido suggested que una disposición de teclado suizo hace que este muy natural para escribir, por lo que los creadores de Scala no se siente dolor suficiente para justificar el langauge complica en esta dirección :)

+1

Al principio pensé que el asunto del "teclado suizo" era una broma, pero después de leer el artículo vinculado, decidí elegirlo como la mejor respuesta. Gracias por llegar al corazón de mi pregunta, que fue "¿POR QUÉ?" esta característica falta en Scala. –

+10

OMG esto es terrible. –

7

Se consideró que la complejidad del compilador adicional que resultaría de no valía la pena las ganancias que se tenía por un lado, y, por otro lado, que su ausencia no sería una carga excesiva.

1

Scala tiene una característica similar para XML:

val x = doSomeCrazyCalculation 
val xml = <foo>{x}</foo> 
7

recojo la sensación es que cadena de interpolación es innecesario, porque no es mucho más concisa que la concatenación:

val str2 = "Hello, ${str1}!" 
val str2 = "Hello, "+str1+"!" 

el argumento de que la El operador "+" en cadenas debe formatearse sin espacio, Martin Odersky says,

Con la nueva convención, la necesidad de sustitución de cadenas (a menudo presentada en las listas de Scala) casi desaparece. Comparar:

"test results: ${result1}, ${result2}" 

con la primera versión anterior. Ha guardado un carácter por sustitución , apenas vale la pena una nueva convención de sintaxis. En otras palabras, la sintaxis sustitución de cadenas de Scala está escrito

"+...+" 

en lugar de

${...} 

o alguna otra propuesta similar. Por otro lado, si insistes en espacios alrededor del +, la historia se vuelve mucho menos convincente.

Por cierto, ver la publicación del blog, "String Interpolation in Scala" donde se emula mediante la reflexión.

+1

Daniel (quien dio la primera responder aquí y es aparentemente demasiado modesto para promocionarlo) también ha producido una solución (http://dcsobral.blogspot.com/2010/01/string-interpolation-in-scala-with.html). Tenga en cuenta que requiere una versión posterior a Scala 2.8.0.Beta1. –

+2

Tienen un buen punto ... son solo 4 caracteres frente a 3. Lo que sería bueno es una modificación IDE de Eclipse para resaltar "+ ... +" de manera diferente al inicio/fin de la secuencia normal. –

+8

No creo que la comparación sea válida en el caso general. Si necesita interpolar una expresión, la comparación debería ser: '" 1 + 1 = \ {1 + 1}! "' (13 caracteres) vs '" 1 + 1 = "+ (1 + 1) +"! " '(16 caracteres) –

Cuestiones relacionadas