Scala многострочная строка-заполнитель - PullRequest
2 голосов
/ 02 мая 2011

Этот вопрос относится к ( Почему в Scala нет интерполяции строк? ), но более конкретно касается многострочных строк.

Я только что купил в Martinпредложение для простой строки-заполнителя, где msg = "Hello {name}!"

может быть представлено без особой разницы в Scala сегодня следующим образом: msg = "Hello" + name + "!"

Тем не менее, я не думаю, что подход подходит для многострочных строк.И в некоторых случаях это может поощрять другие плохие практики в пользу читабельности.Обратите внимание, что в отображении базы данных Scala Play ANORM структура пытается сохранить читаемость в простом SQL (с использованием заполнителей), но за счет дублирования имени переменной {countryCode} и не типичным для безопасности способом, см. ....on ("countryCode" -> "FRA")

SQL(
    """
        select * from Country c 
        join CountryLanguage l on l.CountryCode = c.Code 
        where c.code = {countryCode};
    """
 ).on("countryCode" -> "FRA")

Кроме того, при условии отсутствия изменений в Scala для решения этой проблемы, что будет означать использование встроенного XML?Как бы производительность, память и т. Д. С чем-то вроде:

val countryCode = "FRA"
SQL(<c>        
  select * from Country c 
  join CountryLanguage l on l.CountryCode = c.Code 
  where c.code = {countryCode};
</c>.text)

Ответы [ 3 ]

0 голосов
/ 02 мая 2011

Пример, который вы приводите, почти наверняка не выполняет конкатенацию строк, он создает параметризованные операторы SQL (вероятно, через PreparedStatement JDBC).

По иронии судьбы, отсутствие легкой конкатенации строк, вероятно, немного поощряет лучшие практики в этом случае (хотя я, конечно, не использовал бы это в качестве аргумента в любом случае по теме).

0 голосов
/ 31 января 2019

Если вы придете к этому вопросу из будущего, теперь многолинейная интерполяция строк - это вещь.

val when = "now"
println(s"""this is $when a thing.""")
// this is now a thing
0 голосов
/ 02 мая 2011

Будет создан scala.xml.Elem, в котором содержимое строки будет представлено как ArrayBuffer, выделенный для каждой замены {}.Я, конечно, не авторитет, но я верю, что случится так, что при создании объекта, а затем при получении дочерних элементов и их объединении во время выполнения возникнут некоторые дополнительные издержки, но, по крайней мере, в этом примере, как только он будет передан в SQLфункция, которая затем извлекает требуемую строку (или, возможно, это будет сделано с неявным), объект Elem будет отброшен, так что потребуется немного дополнительной памяти, но ненадолго.

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

...