在 Kotlin DSL 中是不是可以完全避免函数名称?

Posted

技术标签:

【中文标题】在 Kotlin DSL 中是不是可以完全避免函数名称?【英文标题】:Is it possible to avoid function names at all in Kotlin DSL?在 Kotlin DSL 中是否可以完全避免函数名称? 【发布时间】:2018-03-30 20:18:57 【问题描述】:

在Kotlin DSL 示例中,他们使用plus 符号来实现原始内容插入:

html 
    head 
        title +"XML encoding with Kotlin"
    
    // ...

是否可以在接收器中定义“无名”函数以便能够编写

html 
    head 
        title "XML encoding with Kotlin"
    
    // ...

在未来的 Kotlin 版本中是否有这样做的计划?

在 Kotlin 之外的语言中是否有这样的东西?

【问题讨论】:

【参考方案1】:

我可以想到两种解决您问题的方法:

    使带有接收器的 lambda 返回 String:

    fun title(init: Title.() -> String) 
        val t = Title().apply 
            children.add(TextElement(init()))
        
        children.add(t)
    
    

    您现在可以按照 OP 中的建议致电 title。实际上,在这种特定情况下,这似乎是开销,我建议以下。

    创建另一个直接采用Stringtitle 方法:

    class Head : TagWithText("head") 
        fun title(init: Title.() -> Unit) = initTag(Title(), init)
        fun title(text: String) 
            val t = Title().apply 
                children.add(TextElement(text))
            
            children.add(t)
        
    
    

    这样使用:

    head 
        title("XML encoding with Kotlin")
    
    

【讨论】:

我总是有点想知道为什么他们不只是在那个例子中做那个。不需要重新定义一元 + 运算符。 @EpicPandaForce,DSL 示例中的+ 运算符被重载,目的是在同一个块中附加多个部分。如果您想在 DSL 中处理单个值,则确实不需要重载运算符之类的东西。如果要在一个块中处理多个值,则需要将它们全部传递到某个地方。 您也可以将标题设为中缀,这样就不需要括号 为什么选项 1 是开销?

以上是关于在 Kotlin DSL 中是不是可以完全避免函数名称?的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin DSL 学习

Kotlin DSL 学习

使用 Kotlin DSL

gradle kotlin dsl:如何创建使用插件类的共享函数?

Gradle Kotlin DSL:在独特的地方定义 Kotlin 版本

Gradle Kotlin DSL , 你知道它吗?