什么<ClassName>.()在Kotlin中意味着什么?

sat*_*sat 6 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)
Run Code Online (Sandbox Code Playgroud)

SCRIPT是一个类 - https://github.com/Kotlin/kotlinx.html/blob/master/shared/src/main/kotlin/generated/gen-tags-s.kt.

或者更一般地说,<ClassName>.()Kotlin的意思是什么?

s1m*_*nw1 10

快速回答

block: SCRIPT.() -> Unit = {}
Run Code Online (Sandbox Code Playgroud)

这表示" 带接收器的函数文字".这是一个函数类型的函数参数() -> Unit,并SCRIPT为它的接收器.

函数文字/ Lambda与接收器

Kotlin支持"带接收器的函数文字"的概念.它允许在没有任何特定限定符的情况下访问其体内lambda 接收器的可见方法和属性.这与扩展函数非常相似,在扩展函数中也可以访问扩展中的接收者对象的可见成员.

一个简单的例子,也是Kotlin标准库中最重要的功能之一,是apply:

public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这样一个带接收器的函数文字作为参数block.简单地执行该块并T返回接收器(其实例).在行动中,这看起来如下:

val foo: Bar = Bar().apply {
    color = RED
    text = "Foo"
}
Run Code Online (Sandbox Code Playgroud)

我们实例化一个对象Bar并调用apply它.实例Bar成为"接收者".的block,如在参数传递{}(lambda表达式)不需要使用额外的限定词来访问和修改可见显示属性colortext.

带接收器的lambda的概念也是用Kotlin编写DSL的最重要特性.