在 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
。实际上,在这种特定情况下,这似乎是开销,我建议以下。
创建另一个直接采用String
的title
方法:
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 中是不是可以完全避免函数名称?的主要内容,如果未能解决你的问题,请参考以下文章
gradle kotlin dsl:如何创建使用插件类的共享函数?