gpt4 book ai didi

scope - Kotlin - 限制扩展方法范围

转载 作者:行者123 更新时间:2023-12-04 22:57:52 27 4
gpt4 key购买 nike

有没有办法限制 DSL 中的扩展方法?

假设我有一个这样的类结构:

class Outer {
fun middle(op: Middle.() -> Unit): Middle {
val middle = Middle()
middle.op()
return middle
}
}

class Middle {
fun inner(op: Inner.() -> Unit): Inner {
val inner = Inner()
inner.op()
return inner
}
}

class Inner

fun outer(op: Outer.() -> Unit): Outer {
val outer = Outer()
outer.op()
return outer
}

然后我可以像这样创建一个调用:
outer {
middle {
inner {
middle { } // Here is the problem
}
}
}

我的问题是标记为 middle { }调用令人困惑,因为它添加了 MiddleOuter当它看起来像是添加到 Inner .

有没有办法不允许 middle { }称呼?

最佳答案

您可以使用 deprecated 的解决方法:

class Outer {
fun middle(op: Middle.() -> Unit): Middle {...}

@Deprecated("can not be used inside a Outer block", level = DeprecationLevel.ERROR)
fun outer(op: Outer.() -> Unit): Outer = TODO()
}

class Middle {
fun inner(op: Inner.() -> Unit): Inner {...}

@Deprecated("can not be used inside a Middle block", level = DeprecationLevel.ERROR)
fun middle(op: Middle.() -> Unit): Middle = TODO()
}

class Inner {
@Deprecated("can not be used inside a Inner block", level = DeprecationLevel.ERROR)
fun inner(op: Inner.() -> Unit): Inner = TODO()
}

现在编译器会给你一个错误,IDE在完成时不会提示错误的函数:
outer {
middle {
inner {
middle { } // error
}
}
}

但是对于大型 DSL,您真的不应该这样做。最好等待 https://youtrack.jetbrains.com/issue/KT-11551正如@KirillRakhman 所建议的那样。

编辑:在我修复了我的例子之后,它变得更小了。一个类的一个虚拟函数毕竟不是那么多样板。

关于scope - Kotlin - 限制扩展方法范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36992822/

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