Замена строки Kotlin не работает, когда строка читается из файла - PullRequest
0 голосов
/ 05 сентября 2018

Я написал код, который читает текстовый файл. Текстовые файлы содержат заполнители, которые я хотел бы заменить. Подстановка не работает таким образом, и строка печатается с заполнителями. Вот код, который я написал для этого:

class TestSub(val sub: Sub) {

    fun create() = template()

    fun template() = Files.newBufferedReader(ClassPathResource(templateId.location).file.toPath()).readText()
}

data class Sub(val name: String, val age: Int)

Вот основная функция, которая пытается напечатать окончательную строку:

fun main(args: Array<String>) {
    val sub = Sub("Prashant", 32)

    println(TestSub(sub).create())
}

Однако, когда вместо чтения файла я использую строку, работает следующий код (замена fun template())

fun template() = "<h1>Hello ${sub.name}. Your age is ${sub.age}</h1>"

Есть ли способ заставить заменитель строки работать при чтении содержимого файла?

Ответы [ 3 ]

0 голосов
/ 05 сентября 2018

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

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

В простых случаях String.format или MessageFormat.format в Java будет работать.

А для сложных случаев проверьте тимелист, скорость и т. Д.

0 голосов
/ 05 сентября 2018

Kotlin не поддерживает строковые шаблоны из файлов. То есть код как "some variable: $variable" компилируется в "some variable: " + variable. Шаблоны String обрабатываются во время компиляции, что означает, что он не работает с текстом, загруженным из файлов, или если вы делаете что-то еще, чтобы String экранировался в необработанную форму. В любом случае, как упоминалось danielspaniol , это будет угрозой безопасности.

Это оставляет три варианта:

  • String.format(str)
  • MessageFormat.format(str)
  • Создание собственного движка

Я не знаю, что содержит ваш файл, но если это строка, которую вы использовали в функции шаблона, измените ее на:

<h1>Hello {0}. Your age is {1,integer}</h1>

Это для MessageFormat, что является моим личным предпочтением. Если вы используете String.format, используйте вместо него %s и другие подходящие форматы.

Теперь используйте это в MessageFormat.format:

val result = MessageFormat.format(theString, name, age);

Обратите внимание, что если вы используете MessageFormat, вам нужно экранировать ' как ''. См это .

0 голосов
/ 05 сентября 2018

Подстановка строки с использованием ${...} является частью синтаксиса строковых литералов и работает примерно так

val a = 1
val b = "abc ${a} def"  // gets translated to something like val b = "abc " + a + " def"

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

Однако я предполагаю, что у Kotlin есть что-то вроде sprintf функции, в которой вы можете иметь заполнители типа %s в вашей строке, и вы можете заменить их значениями


Взгляните здесь . Похоже, самый простой способ - использовать String.format

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...