有没有办法限制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
}
Run Code Online (Sandbox Code Playgroud)
然后我可以像这样创建一个调用:
outer {
middle {
inner {
middle { } // Here is the problem
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,显着的middle { }呼叫是混乱的,因为它增加了一个Middle到Outer时,它看起来是增加了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()
}
Run Code Online (Sandbox Code Playgroud)
现在编译器会给你一个错误,IDE在完成时不会建议错误的函数:
outer {
middle {
inner {
middle { } // error
}
}
}
Run Code Online (Sandbox Code Playgroud)
但你真的不应该为大型DSL做这件事.最好等待https://youtrack.jetbrains.com/issue/KT-11551,如@KirillRakhman建议的那样.
编辑:修好我的例子后,它变小了.对于一个类有一个虚函数,毕竟它不是那么多的样板.
| 归档时间: |
|
| 查看次数: |
454 次 |
| 最近记录: |