当我是Kotlin新手时,我需要一些帮助来理解以下代码。这是我在网上找到的科特林帖子
typealias genericContext<T> = Demo<T>.() -> Unit
class Demo<T> {
infix fun doThis(block: genericContext<T>) = block()
fun say(obj: T) = println(obj.toString())
}
fun main(args: Array<String>)
{
val demo = Demo<String>()
demo doThis { say("generic alias") }
}
所以我了解到,由于有了infix
,我们可以跳过通常的方法调用语法,即demo.doThis
并执行demo doThis
。
但我不理解以下内容:
typealias genericContext<T> = Demo<T>.() -> Unit
这似乎将字符串genericContext<T>
与看起来像lambda的东西相关联,但是我没有得到.()
部分。那用功能Demo
扩展了()
吗?我对这是如何工作感到困惑。有人可以照亮吗?
答案 0 :(得分:4)
typealias genericContext<T> = Demo<T>.() -> Unit
是类型别名。它只是在右侧给类型重新命名。这意味着doThis
中Demo
的声明与此等效:
infix fun doThis(block: Demo<T>.() -> Unit) = block()
现在输入Demo<T>.() -> Unit
类型:
这是一种功能类型。此类型的函数将Demo
作为接收方参数,并返回Unit
。因此,它是在Demo
类中定义或在Demo
类中扩展的所有函数的类型。
当您提供这种类型的lambda时(例如,当您调用doThis
函数时),那么this
将指向lambda中的Demo
对象。例如:
someDemo.doThis {
/* "this" is an object of type `Demo`.
* In this case it's actually "someDemo", because the implementation of "doThis"
* calls "block" on the implicit "this".
*/
this.say("Hey!")
}