【问题标题】: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 之外的语言中是否有这样的东西?

【问题讨论】:

    标签: kotlin dsl receiver


    【解决方案1】:

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

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

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

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

    2. 创建另一个直接采用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 是开销?
    猜你喜欢
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    相关资源
    最近更新 更多