%P 用于字符串模板¶
%S
还会处理美元符号 ($
) 的转义,以避免无意中创建字符串模板,这可能导致生成的代码编译失败
val stringWithADollar = "Your total is " + "$" + "50"
val funSpec = FunSpec.builder("printTotal")
.returns(String::class)
.addStatement("return %S", stringWithADollar)
.build()
生成
fun printTotal(): String = "Your total is ${'$'}50"
如果你需要生成字符串模板,请使用 %P
,它不会转义美元符号
val amount = 50
val stringWithADollar = "Your total is " + "$" + "amount"
val funSpec = FunSpec.builder("printTotal")
.returns(String::class)
.addStatement("return %P", stringWithADollar)
.build()
生成
fun printTotal(): String = "Your total is $amount"
你还可以使用 CodeBlock
作为 %P
的参数,这在你需要在字符串模板内引用可导入的类型或成员时非常方便
val file = FileSpec.builder("com.example", "Digits")
.addFunction(
FunSpec.builder("print")
.addParameter("digits", IntArray::class)
.addStatement("println(%P)", buildCodeBlock {
val contentToString = MemberName("kotlin.collections", "contentToString")
add("These are the digits: \${digits.%M()}", contentToString)
})
.build()
)
.build()
println(file)
上面的代码片段将生成以下输出,并正确处理导入
package com.example
import kotlin.IntArray
import kotlin.collections.contentToString
fun print(digits: IntArray) {
println("""These are the digits: ${digits.contentToString()}""")
}