在kotlin lambda中,字符串如何接受lambda?

在kotlin lambda中,字符串如何接受lambda?,lambda,kotlin,gradle-kotlin-dsl,Lambda,Kotlin,Gradle Kotlin Dsl,在gradle kotlin dsl中。。。这是有效代码 tasks { "build" { // inner lambda code here 一个字符串可以接受lambda参数,或者这个语法是如何工作的?字符串“build”似乎是替代函数调用的字符串列表之一? 适用类定义中的某些内容必须设置这种行为,但我无法思考如何做到这一点 这种工作方式可能是一种有其他用途的技术,但要评估它,有必要知道它是如何工作的 这是两个Kotlin语言功能的组合,通常用于创建,具体来说: in

在gradle kotlin dsl中。。。这是有效代码

tasks {
   "build" {
      // inner lambda code here
一个字符串可以接受lambda参数,或者这个语法是如何工作的?字符串“build”似乎是替代函数调用的字符串列表之一? 适用类定义中的某些内容必须设置这种行为,但我无法思考如何做到这一点


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

这是两个Kotlin语言功能的组合,通常用于创建,具体来说:

  • invoke运算符,它允许您使用任意参数列表()为类型定义
    ()
    函数调用运算符
  • 能够将最后一个lambda参数传递给参数列表()中通常需要的参数以外的函数
  • 扩展,允许您向现有类型添加新方法,即使您不拥有这些方法()
要实现您特别询问的语法,您可以编写如下方法:

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

关键是在这个扩展中,您可以访问
字符串
,它被调用为
this
,并且您将拥有传递给它的lambda



作为进一步参考,本文由多部分组成,展示了一些DSL构建技术。

这是Kotlin语言功能的组合,通常用于创建,特别是:

  • invoke运算符,它允许您使用任意参数列表()为类型定义
    ()
    函数调用运算符
  • 能够将最后一个lambda参数传递给参数列表()中通常需要的参数以外的函数
  • 扩展,允许您向现有类型添加新方法,即使您不拥有这些方法()
要实现您特别询问的语法,您可以编写如下方法:

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

关键是在这个扩展中,您可以访问
字符串
,它被调用为
this
,并且您将拥有传递给它的lambda


为了进一步的参考,本文是一篇多部分的文章,展示了一些DSL构建技术