gpt4 book ai didi

kotlin 内部 DSL 使用中缀函数来增加清晰度

转载 作者:IT老高 更新时间:2023-10-28 13:45:28 25 4
gpt4 key购买 nike

kotlin 1.2.71

我正在编写以下 DSL,并希望使其尽可能接近此示例:

android {
compileSdkVersion 26
buildToolsVersion "28.0.3"
}

我正在使用中缀函数以及 lambda 和接收器来执行此操作。在我的 DSL 中,我必须使用 it 关键字,否则我无法使中缀函数工作。只是想知道,是否有办法做到这一点?

另一个问题:在我的中缀函数中,我是否需要将它用作扩展函数并在它前面加上键盘 Android 即 infix fun Android.buildToolsVersion(...)

fun main(args: Array<String>) {

val androidConfig = android {
it buildToolsVersion "28.0.3"
it compileSdkVersion 26
}

println(androidConfig.toConsolePrint)
}

private fun android(block: Android.(Android) -> Unit): Android {
val android = Android()

android.block(android)

return android
}

class Android(var compileSdkVersion: Int = 0,
var buildToolsVersion: String = "") {

infix fun Android.buildToolsVersion(buildToolsVersion: String) {
this.buildToolsVersion = buildToolsVersion
}

infix fun Android.compileSdkVersion(sdkVersion: Int) {
compileSdkVersion = sdkVersion
}
}

private val Android.toConsolePrint: String
get() {
return "compileSDK: $compileSdkVersion build tools: $buildToolsVersion"
}

最佳答案

澄清一下:您不需要 it 来使 infix 工作。你也可以只写 this 代替,例如这个 compileSdkVersion 26.

另请注意,只需准备好以下内容就足够了:

fun android(block: Android.() -> Unit) = Android().apply(block)
class Android(var compileSdkVersion: Int = 0,
var buildToolsVersion: String = "")

然后,用法与您显示的内容仅相差 =:

val androidConfig = android {
buildToolsVersion = "28.0.3"
compileSdkVersion = 26
}

但好处更大:需要维护的代码更少;-)

关于您提到的另一点,您需要提供扩展功能。你不需要。只需将 infix fun Android.buildToolsVersion 放在 class Android 内,而没有 Android. 就可以了,例如:

class Android(var compileSdkVersion: Int = 0,
var buildToolsVersion: String = "") {
infix fun buildToolsVersion(buildToolsVersion: String) {
this.buildToolsVersion = buildToolsVersion
}

现在关于 consolePrint。这在我看来也相当复杂。 class Android 中的以下内容呢?

fun toConsolePrint() = "compileSDK: $compileSdkVersion build tools: $buildToolsVersion"

这就是函数的实际用途......当然:如果你不喜欢括号,你仍然可以使用 get() 的方法,但它听起来像一个函数,它就像一个函数,所以它可能也是一个函数;-)

完整示例,唯一不同的是添加了 ()=:

fun main() {
val androidConfig = android {
buildToolsVersion = "28.0.3"
compileSdkVersion = 26
}
println(androidConfig.toConsolePrint())
}

fun android(block: Android.() -> Unit) = Android().apply(block)
class Android(var compileSdkVersion: Int = 0,
var buildToolsVersion: String = "") {
fun toConsolePrint() = "compileSDK: $compileSdkVersion build tools: $buildToolsVersion"
}

关于kotlin 内部 DSL 使用中缀函数来增加清晰度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52963339/

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