Scala интерполировать строку из переменной - PullRequest
0 голосов
/ 02 июня 2018

Строковая интерполяция отлично работает в этом случае:

val name = "Bill"
val result = s"My Name is ${name}"

Когда я вводил ее в переменную, она не получала интерполированное значение:

val name = "Bill"
val greeting = "My Name is ${name}"
val result = s"${greeting}"

Прямое перенос greetingне является подходящим решением, я должен обрабатывать приветствие как обычную строку.

Ответы [ 2 ]

0 голосов
/ 22 июля 2018
  • Существует неиспользуемая переменная name со значением "Bill"
  • Существует String переменная greeting, которая содержит символы ['M','y',' ','n','a','m','e',' ','i','s',' ','$','{','n','a','m','e','}'] (полностью не связана с переменной nameчетыре символа 'n', 'a', 'm', 'e' не имеют возможности найти что-либо рядом с таблицей символов компилятора, что хорошо).
  • Существует переменная result, значение которого вычисляется путем интерполяции строки из greeting.Поскольку

    val y = "whatever"
    val x = s"${y}"
    

    всегда должен приводить к тому, что переменная x имеет такое же содержимое, что и переменная y, переменная result заканчивается тем же значением, что и greeting, а именно "My Name is ${name}".

Если компилятор попытается выполнить каждую подстроку, похожую на код Scala, это приведет к полному хаосу, потому что каждый раз, когда что-то может просочиться из области String -данных вобласть исполняемого кода, делает код уязвимым для всех видов эксплойтов.

0 голосов
/ 02 июня 2018

Строковая интерполяция в Scala складывается не так, как вы ожидаете.

Проблема для этого обсуждалась .Люди хотят этого, но люди не всегда получают то, что хотят.

Вы могли бы представить, что пишете несколько макросов, которые работают в концерте.Один определяет функцию, принимающую строку, другой знает, как интерполировать ее, вызывая ее с правильно названным значением в области.

Также стоит добавить, что интерполяция не является общим механизмом шаблонирования во время выполнения.Например, вы не можете читать строки из файла вида "$greeting" и выполнять интерполяционные замены для него.

...