跳到内容

%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()}""")
}