Kotlin - 限制扩展方法范围

Ruc*_*oom 4 dsl scope kotlin

有没有办法限制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 { }呼叫是混乱的,因为它增加了一个MiddleOuter时,它看起来是增加了Inner.

有没有办法不允许middle { }通话?

vod*_*dan 8

您可以使用以下解决方法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建议的那样.

编辑:修好我的例子后,它变小了.对于一个类有一个虚函数,毕竟它不是那么多的样板.