动态评估Kotlin中的模板化字符串

假设我有以下一段Kotlin代码:

fun main(args: Array<String>) { val a = "test" println(args.first()) } 

如果我传递一个参数$a ,输出将是$a 。 据我所知,Kotlin通过生成编译输出的代码来处理字符串模板,大概是使用StringBuilder。 有没有一些方法来评估不在源代码中的字符串在当前上下文中的模板? 字符串模板是非常有用的,能够评估来自动态上下文的表达式(比如配置文件)是非常好的,但据我所知,这是不可能的。

缺乏这个,对此有什么好的方法? 调用脚本引擎?

如果您需要以这种方式评估任意表达式,那么是的,您需要一个脚本引擎。 Kotlin有一个您可以使用的JSR 223实现,请参阅这里的示例( kotlin-jsr223-*项目) 。

这是一个基本的用法示例:

 val engine = ScriptEngineManager().getEngineByExtension("kts")!! engine.eval("val x = 3") val res = engine.eval("x + 2") Assert.assertEquals(5, res) 

代码取自KotlinJsr223ScriptEngineIT.kt ,并记得通过META-INF配置服务

有没有一些方法来评估不在源代码中的字符串在当前上下文中的模板?

代码示例中没有模板字符串,未使用a。 我正确理解,你想做一些像val evaluated = evalStringTemplate(template, arg1, arg2, ...)template是一个String"$a"和arg1,arg2,…参数模板?

如果是这样的话,没有Kotlin特定的方法来做到这一点,但你可以使用Java 格式化类。