是否有可能在Kotlin DSL中完全避免使用功能名称?

时间:2018-03-30 20:18:58

标签: kotlin dsl receiver

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:5)

我可以想到两个问题的解决方案:

  1. 使接收器的lambda返回String

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

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

  2. 创建另一个直接带有title的{​​{1}}方法:

    String

    像这样使用:

    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)
        }
    }