kotlin - <ClassName>.() 在 Kotlin 中是什么意思?

标签 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 .

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

最佳答案

快速解答

block: SCRIPT.() -> Unit = {}

这表示“带有接收器的函数文字”。它是一个函数参数,函数类型为 () -> UnitSCRIPT,因为它是 receiver

Function Literals/Lambda with Receiver

Kotlin 支持“带有接收器的函数文字”的概念。它允许访问其主体中 lambda 的接收器 的可见方法和属性,而无需任何特定限定符。这非常类似于扩展函数,其中还可以访问扩展内接收器对象的可见成员。

一个简单的例子,也是 Kotlin 标准库中最伟大的函数之一,是apply:

public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }

如你所见,这样一个带有接收者的函数字面量在这里被当作参数block。这个 block 被简单地执行并返回接收者(它是 T 的一个实例)。实际情况如下:

val foo: Bar = Bar().apply {
    color = RED
    text = "Foo"
}

我们实例化一个 Bar 的对象并在其上调用 applyBar 的实例成为“接收者”。在 {}(lambda 表达式)中作为参数传递的 block 不需要使用额外的限定符来访问和修改显示的可见属性 color文本

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

关于kotlin - <ClassName>.() 在 Kotlin 中是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48244734/

相关文章:

kotlin - 如何在 Dokka 生成的文档中嵌入可运行的示例代码

java - proguard 规则不适用于某些 Java 文件

Kotlin:如何创建带有更改的数据类的新实例

android - 寻找Android应用程式中Kotlin非空断言错误的解释吗?

java - HTML 到文本,带有自定义链接点击监听器

annotations - 如何将 com.sun.tools.javac.code.Attribute 导入 kotlin 模块?

android - 如何在房间中自动增加主键?

java - Guice:在 Binder 内独立使用相同的实例

kotlin - 如何在撰写桌面中删除 Windows 标题栏或自定义它?

kotlin - Kotlin 中 CompletableFuture 异常方法的使用