2010-03-20 3 views
11

Это не просто провал ... Интересно, знает ли кто-нибудь, есть ли реальная причина дизайна, почему Scala не поддерживает интерполяцию, похожую на Groovy и другие «синтаксически лучшие Javas»?Почему в Scala нет интерполяции строк?

например.

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

Этот вопрос похож на http://stackoverflow.com/ вопросы/2183503/substitute-values-in-a-string-with-placeholders-in-scala/2189134 с разными ответами. –

+0

@Mitch: На самом деле это не тот же вопрос. Другой спрашивающий хотел знать, как это сделать; Я хотел знать обоснование решения дизайнеров Scala, о котором хорошо сказано ниже. –

+1

В настоящее время (Interpolation Stala 2.10 String): 's« Hello, $ str1 »' (http://docs.scala-lang.org/overviews/core/string-interpolation.html) –

ответ

16

Предлагаемое решение состоит в том, чтобы опустить пробелы при использовании +.

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

Это было suggested, что швейцарская раскладка клавиатуры делает это очень естественно ввести, поэтому создатели Scala не чувствуют себя достаточно боли, чтобы оправдать усложняя LANGAUGE в этом направлении :)

+1

Сначала я подумал, что «швейцарская клавиатура» была шуткой, но после прочтения связанной статьи я решил выбрать это как лучший ответ! Спасибо, что попал в суть моего вопроса, который был «ПОЧЕМУ?» эта функция отсутствует в Scala. –

+10

OMG это ужасно. –

7

Было признано, что дополнительная сложность компилятора, что бы из него не стоит выгоды, которые будут иметься, с одной стороны, и, с другой стороны, что его отсутствие не будет слишком обременительным.

1

Scala имеет аналогичную функцию для XML:

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

я понимаю чувство, что строка интерполяция не является необходимой, потому что это не намного более кратким, чем конкатенация:

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

Утверждая, что Оператор «+» на строках должен быть отформатирован без пробела, Martin Odersky says,

С новым соглашением необходимость замены строк (часто , выдвинутых в списках Scala) все исчезает. Сравнить:

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

с первой версией выше. Вы сохранили один символ за замену , вряд ли стоит новое соглашение о синтаксисе. Другими словами, синтаксис строки подстановки Scala написана

"+...+" 

вместо

${...} 

или некоторые другие аналогичные предложения. С другой стороны, если вы настаиваете на пробелах вокруг +, история становится менее убедительней.

Кстати, см. Сообщение в блоге «String Interpolation in Scala», где он эмулируется с использованием отражения.

+1

Даниэль (который дал первый ответ здесь и, по-видимому, слишком скромный, чтобы его продвинуть) также подготовил решение (http://dcsobral.blogspot.com/2010/01/string-interpolation-in-scala-with.html). Обратите внимание, что для этого требуется релиз позже Scala 2.8.0.Beta1. –

+2

У них есть хорошая точка ... это всего лишь 4 символа против 3. Что было бы неплохо, это модификация IDE Eclipse, чтобы выделить «+ ... +» иначе, чем обычный запуск/конец строки! –

+8

Я не думаю, что сравнение действительно в общем случае. Если вам нужно интерполировать выражение, сравнение должно быть: «1 + 1 = \ {1 + 1}!" '(13 символов) vs' "1 + 1 =" + (1 + 1) + "!" '(16 символов) –

0

Учитывайте, что литерал XML оценивается только один раз. См. Scala multiline string placeholder для варианта вопроса, посвященного многострочным строкам.

Смежные вопросы