【问题标题】: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 构建技术。