【问题标题】:What does <ClassName>.() mean in Kotlin?<ClassName>.() 在 Kotlin 中是什么意思?
【发布时间】:2018-01-13 22:08:53
【问题描述】:

不确定这是什么意思,但我在 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

或者更一般地说,&lt;ClassName&gt;.() 在 Kotlin 中是什么意思?

【问题讨论】:

标签: kotlin


【解决方案1】:

快速解答

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

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

Function Literals/Lambda with Receiver

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

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

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 的实例成为“接收者”。在{}(lambda 表达式)中作为参数传递的block 不需要使用额外的限定符来访问和修改显示的可见属性colortext

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

【讨论】:

    【解决方案2】:

    .() 在 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-22
      • 2019-10-08
      • 2021-08-23
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多