Почему в Scala нет интерполяции строк?
Это не просто простуда... Интересно, знает ли кто-нибудь, существует ли фактическая причина дизайна, почему Scala не поддерживает интерполяцию, похожую на Groovy и другие синтаксически лучшие Javas?
например.
var str1 = "World";
var str2 = "Hello, ${str1}";
Ответы
Ответ 1
Предлагаемое решение состоит в том, чтобы опустить пробелы при использовании +
.
"a="+a+", b="+b
предложил, что швейцарская раскладка клавиатуры делает это очень естественным, поэтому создатели Scala не чувствуют достаточно боли, чтобы оправдать усложнение langauge в этом направлении:)
Ответ 2
Строковая интерполяция находится в Scala 2.10. См. SIP.
Если вы используете более раннюю версию Scala, там также плагин компилятора ScalaEnhancedStrings.
Ответ 3
Было сочтено, что дополнительная сложность компилятора, которая возникла бы из-за этого, не стоила бы выигрыша, с одной стороны, и, с другой стороны, его отсутствие не было бы чрезмерно обременительным.
Ответ 4
Я понимаю, что String-интерполяция не нужна, потому что она не намного лаконична, чем конкатенация:
val str2 = "Hello, ${str1}!"
val str2 = "Hello, "+str1+"!"
Утверждая, что оператор "+" на строках должен быть отформатирован без пробела, Мартин Одерски говорит,
С новым соглашением необходимость замены строк (часто выставляются в списках Scala), но все исчезают. Для сравнения:
"test results: ${result1}, ${result2}"
с первой версией выше. Вы сохранили один символ за замена, вряд ли стоит нового соглашения о синтаксисе. Другими словами, Scala синтаксис строковой подстановки написан
"+...+"
вместо
${...}
или другое подобное предложение. С другой стороны, если вы настаиваете на пробелы вокруг +, история становится намного менее убедительной.
Кстати, см. сообщение в блоге: String Interpolation в Scala", где он эмулируется с использованием отражения.
Ответ 5
Начиная с Scala 2.10.0, Scala выполняет поддержку интерполяции строк
Пример:
val name = "James"
println(s"Hello, $name") // Hello, James
Ответ 6
В настоящее время в trunk помещается строповая интерполяция в Scala, см. эту фиксацию Мартина, поэтому она, вероятно, будет доступна в Scala 2.10. См. Также первый пример для примера: https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/test/files/run/stringInterpolation.scala
Ответ 7
Scala имеет аналогичную функцию для XML:
val x = doSomeCrazyCalculation
val xml = <foo>{x}</foo>
Ответ 8
Рассмотрим, что литерал XML оценивается только один раз. См. Scala многострочный заполнитель строк для варианта вопроса, посвященного многострочным строкам.