什么<classname>。()在Kotlin中意味着什么?

时间:2018-01-13 22:08:54

标签: 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中意味着什么?

2 个答案:

答案 0 :(得分:9)

快速回答

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

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

Function Literals/Lambda with Receiver

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

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

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

如您所见,带接收器的这种函数文字在此处被视为参数block。简单地执行该块并返回接收器(它是T的实例)。在行动中,这看起来如下:

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

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

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

答案 1 :(得分:0)

<块引用>

.() 在 Kotlin 中是什么意思?

它被称为带有接收器的函数文字(或 lambda)

尝试解释相同的示例:

data class Person(val name: String)

fun getPrefixSafely(
    prefixLength: Int,
    person: Person?,
    getPrefix: Person.(Int) -> String): String
{
    if (person?.name?.length ?: 0 < prefixLength) return ""
    return person?.getPrefix(prefixLength).orEmpty()
}

// Here is how getPrefixSafely can be called
getPrefixSafely(
    prefixLength = 2,
    person = Person("name"),
    getPrefix = { x -> this.name.take(x) }
)

PS:这些具有接收器类型的函数文字类似于 IMO 的扩展函数。