Kotlin中的。()是什么意思?
不知道这是什么意思,但我在kotlin html代码库中遇到了这个语法。 SCRIPT。()是什么意思?
https://github.com/Kotlin/kotlinx.html/blob/master/shared/src/main/kotlin/generated/gen-tag-unions.kt#L143
fun FlowOrPhrasingOrMetaDataContent.script(type : String? = null, src : String? = null, block : SCRIPT.() -> Unit = {}) : Unit = SCRIPT(attributesMapOf("type", type,"src", src), consumer).visit(block)
SCRIPT是一个类 – https://github.com/Kotlin/kotlinx.html/blob/master/shared/src/main/kotlin/generated/gen-tags-s.kt 。
或者更一般地说,Kotlin中的.()
是什么意思?
快速回答
block : SCRIPT.() -> Unit = {}
这代表了一个“ 与接收器的函数文字” 。 这是一个函数参数,函数types() -> Unit
和SCRIPT
作为接收器 。
函数Literals / Lambda与接收器
Kotlin支持“function文字与接收器”的概念。 它允许访问lambda的接收者的可见方法和属性, 而不需要任何特定的限定符 。 这与扩展函数非常相似,在扩展函数中也可以访问扩展中的接收者对象的可见成员。
一个简单的例子,也是Kotlin标准库中最重要的function之一, apply
:
public inline fun T.apply(block: T.() -> Unit): T { block(); return this }
正如你所看到的,这样一个带有接收者的函数文字就是这里的参数block
。 这个块被简单地执行,接收者(它是T
一个实例)被返回。 在行动中,这看起来如下:
val foo: Bar = Bar().apply { color = RED text = "Foo" }
我们实例化一个Bar
的对象,然后调用它。 Bar
的实例成为“接收者”。 作为{}
(lambdaexpression式)中的parameter passing的block
不需要使用其他限定符来访问和修改显示的可见属性的color
和text
。
带有接收器的lambdas的概念也是用Kotlin编写DSL的最重要的特性。