不确定这意味着什么,但我在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中意味着什么?
答案 0 :(得分:9)
block: SCRIPT.() -> Unit = {}
这表示“函数文字与接收者”。它是一个函数参数,函数类型() -> Unit
和SCRIPT
,因为它是接收器。
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
的对象并在其上调用apply
。 Bar
的实例成为“接收者”。在block
(lambda表达式)中作为参数传递的{}
不需要使用其他限定符来访问和修改显示的可见属性color
和text
。
带接收器的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 的扩展函数。