【问题标题】:within a kotlin lambda, how does a string accept a lambda?在 kotlin lambda 中,字符串如何接受 lambda?
【发布时间】:2018-10-25 13:10:00
【问题描述】:

在 gradle-kotlin-dsl... 这是有效的代码

tasks {
   "build" {
      // inner lambda code here

字符串可以接受 lambda 参数是如何工作的,或者这个语法是如何工作的?字符串“build”似乎是替代函数调用的字符串列表之一? 适用的类定义中的某些内容必须设置此行为,但我想不出这是如何完成的。

这种工作方式可能是一种具有其他用途的技术,但要评估它,有必要知道它是如何工作的!

【问题讨论】:

标签: lambda kotlin gradle-kotlin-dsl


【解决方案1】:

这是一些 Kotlin 语言特性的组合,这些特性通常用于创建 DSLs,具体来说:

  • invoke 运算符,可让您使用任意参数列表 (docs) 为类型定义 () 函数调用运算符
  • 能够将最后一个 lambda 参数传递给参数列表通常需要的括号之外的函数 (docs)
  • 扩展,让您向现有类型添加新方法,即使您不拥有它们 (docs)

要实现您具体询问的语法,您可以编写如下方法:

operator fun String.invoke(block: () -> Unit) {
    // Do whatever you'd like with the String and the lambda
    // you received as a parameter
}

您作为参数的 lambda 也可以是您想要的任何类型的扩展(可能是 String 本身,但取决于您的用例),可以接受参数,或者期望返回一个值而不仅仅是Unit

关键是在这个扩展中,你可以访问String,它被称为this,你会得到传递给它的lambda。


如需进一步参考,here's 是一篇多篇文章,展示了一些 DSL 构建技术。

【讨论】:

    猜你喜欢
    • 2021-06-16
    • 1970-01-01
    • 2018-11-28
    • 2023-02-25
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    相关资源
    最近更新 更多