T.()的Kotlin函数签名是什么意思?

这是一个标准的Kotlin函数(据我所知)

inline fun<T> with(t: T, body: T.() -> Unit) { t.body() } 

但是,谁能用简单的英文写出这个签名究竟意味着什么呢? 它是T的泛型函数,T的第一个参数“t”,第二个函数类型的“body”,接受函数? 并没有返回(单位)

我看到这个符号Something。() – >东西很常用,也就是Anko:

 inline fun Activity.coordinatorLayout(init: CoordinatorLayout.() -> Unit) = ankoView({ CoordinatorLayout(it) },init) 

但我不认为这是解释任何地方()的意思是…

T.() -> Unit是带接收者的扩展函数类型。

除了普通的功能外,Kotlin还支持扩展功能。 这种功能与普通的不同之处在于它具有接收机类型规范。 这里是一个通用的T.部分。

扩展函数中的this关键字对应于接收者对象(在点之前传递的对象),因此您可以直接调用它的方法(从父范围引用this对象仍然可以使用限定符 )。

功能with标准是一致的。 这是目前的代码:

 /** * Calls the specified function [f] with the given [receiver] as its receiver and returns its result. */ public inline fun <T, R> with(receiver: T, f: T.() -> R): R = receiver.f() 

所以对于TR ,这是一个通用的函数,第一个参数是“ T ”类型的接收者,第二个是扩展函数类型的函数类型,它扩展了T ,返回类型R

例如,你可以像这样使用它:

 val threadInfoString = with (Thread.currentThread()) { // isDaemon() & getPriority() are called with new property syntax for getters & setters "${getName()}[isDaemon=$isDaemon,priority=$priority]" } 

请参阅此处的扩展功能文档:
kotlinlang.org/docs/reference/lambdas.html#extension-function-expressions
kotlinlang.org/docs/reference/extensions.html


添加:

那么唯一有效的f是为T定义的任何0参数函数?

不是真的。 在Kotlin中, 函数类型和扩展函数类型是统一的 ,所以它们可以互换使用。 例如,我们可以传递一个函数(String) -> Int String :: length。

 // map() expects `(String) -> Int` // argument has type `String.() -> Int` strings.map(String::length) 

Thread.() -> String(Thread) -> String这样的类型在背景侧是相同的 – 接收者,实际上是第一个参数。

所以以下任何函数都适用于Thread.() -> String参数:

 fun main(args: Array<String>) { val f1 = fun Thread.(): String = name val f2 = fun Thread.() = name val f3: Thread.() -> String = { name } val f4: (Thread) -> String = { it.name } val f5 = { t: Thread -> t.name } val f6: (Thread) -> String = Thread::getNameZ val f7: Thread.() -> String = Thread::getNameZ val f8 = Thread::getNameZ } fun Thread.getNameZ() = name 

或者,您可以像使用threadInfoString那样简单地使用函数literal ( {} ),但只有在可以从上下文中推断接收器类型的情况下,它才起作用。