gpt4 book ai didi

kotlinpoet - 如何动态定义带参数的代码块

转载 作者:行者123 更新时间:2023-12-04 16:00:30 27 4
gpt4 key购买 nike

我卡在了这个特性上,下面是预期生成的代码,参数总数不是固定的,可能有 2 个,或者 3 个或更多。

val 实例:InstanceType = Instance(parameter1, parameter2)

这是在一个函数中,所以我只知道我应该使用.addCode(CodeBlock.of("%L", PropertySpec))

但是我没有找到一种方法来定义需要传入动态参数的代码块。有什么建议吗?

最佳答案

有两种方法可以解决这个问题。首先,CodeBlock 有一个 Builder 允许您动态构建它。这是一个例子:

@Test fun manyParams() {
val instanceType = ClassName("", "InstanceType")
val instance = ClassName("", "Instance")
val params = listOf("param1", "param2")
val prop = PropertySpec.builder("instance", instanceType)
.initializer(CodeBlock.builder()
.add("%T(", instance)
.apply {
params.forEachIndexed { index, param ->
if (index > 0) add(",%W")
add(param)
}
}
.add(")")
.build())
.build()

assertThat(prop.toString()).isEqualTo("""
|val instance: InstanceType = Instance(param1, param2)
|""".trimMargin())
}

其次,您可以为每个参数创建一个单独的 CodeBlock 并加入它们:

@Test fun manyParams() {
val instanceType = ClassName("", "InstanceType")
val instance = ClassName("", "Instance")
val params = listOf("param1", "param2")
val paramCodeBlocks = params.map { CodeBlock.of(it) }
val prop = PropertySpec.builder("instance", instanceType)
.initializer("%T(%L)", instance, paramCodeBlocks.joinToCode(separator = ",%W"))
.build()

assertThat(prop.toString()).isEqualTo("""
|val instance: InstanceType = Instance(param1, param2)
|""".trimMargin())
}

关于kotlinpoet - 如何动态定义带参数的代码块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50635188/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com