У меня в приложении, допустим, есть строка :
val iTest = 1
И есть поле для ввода.
Я хочу, чтобы, допустим, пользователь мог ввести :
"значение $iTest",
И оно бы преобразовало эту строку в
" значение 1"
И вывело обратно.
Это возможно?
Скорее нет, чем да.
Без какой-либо магии или костылей, насколько я понимаю, тут не обойдётся.
Искать просто локальные переменные, мягко говоря, слишком сложно решаемая задача (Reflection или другие встроенные средства такой инфы не дают, вот тут ребята пишут про очень сложные обходные варианты:
https://stackoverflow.com/questions/38663360/it-is-possible-to-get-local-variable-names-programmatically-in-java-or-kotlin), так что нужно будет где-то хранить явно то, что можно отдать пользователю.
Для преобразования строки варианты действий примерно такие:
1. Использовать Script Engine. Подключаем дополнительные либы (kotlin-plugin, kotlin-script-runtime, kotlin-script-util, надеюсь, что всё), добавляем инфу о engine в META-INF, пишем явно код вроде ниже указанного:
fun main(args: Array<String>) {
with(ScriptEngineManager().getEngineByExtension("kts")) {
eval("val x = 3")
val res2 = eval("\"hello \$x \${x+3}\"")
println(res2)
println(eval(readLine()))
}
}
В консоли (вторая строка моя):
hello 3 6
"$x ${x*x}"
3 9
Примеры такого можно искать тут:
https://github.com/JetBrains/kotlin/blob/master/libraries/examples/kotlin-jsr223-local-example/src/test/kotlin/org/jetbrains/kotlin/script/jsr223/KotlinJsr223ScriptEngineIT.kt#L67https://stackoverflow.com/questions/44009515/dynamically-evaluating-templated-strings-in-kotlinhttps://kotlinexpertise.com/run-kotlin-scripts-from-kotlin-programs/Нюансы - неочевидно, как исхитриться и написать штуку, чтобы без кучи лишнего кода объявлять переменные и в программу и в скриптовый движок. Пару телодвижений попробовал изобразить тут, но оба с недостатками (в виде отвратительного кода и косяков):
https://gist.github.com/Jellymath/3d730d6ca1b23e59cf76cd29c5c17be8Ну и нужно понимать, что это стрельба из пушки по воробьям, штука мягко говоря опасная для реального использования (давать на откуп пользователю произвольные скрипты)
2. Самому навелосипедить разбор строк с поиском долларов в них. Для этого все равно придётся куда-то по-сложному положить переменные. Скорее всего такое решение во всех пониманиях более адекватное, так как несёт за собой меньшее количество больших проблем.
P.S. Мог ошибиться во всём, так что лучше перепроверять мои утверждения.