不确定这是什么意思,但我在 kotlin html 代码库中遇到了这种语法。 SCRIPT.() 是什么意思?
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 = {}
这表示“带有接收器的函数文字”。它是一个函数参数,函数类型为 () -> Unit
和 SCRIPT
,因为它是 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
的对象并在其上调用 apply
。 Bar
的实例成为“接收者”。在 {}
(lambda 表达式)中作为参数传递的 block
不需要使用额外的限定符来访问和修改显示的可见属性 color
和 文本
。
带有接收器的 lambda 概念也是使用 Kotlin 编写 DSL 的最重要的特性。
关于kotlin - <ClassName>.() 在 Kotlin 中是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48244734/