Typealias и расширение функции в Kotlin - PullRequest
0 голосов
/ 15 февраля 2019

Мне нужна помощь в понимании следующего кода, так как я новичок в Kotlin.Это из сообщения 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> ассоциируется с чем-то похожим на лямбду, но я не получаю часть .().Что расширяет Demo с помощью функции ()?Я запутался в том, как это работает.Может ли кто-нибудь пролить свет?

1 Ответ

0 голосов
/ 15 февраля 2019

typealias genericContext<T> = Demo<T>.() -> Unit - псевдоним типа.Это просто дает новое имя типу на правой стороне.Это означает, что объявление doThis в Demo эквивалентно этому:

infix fun doThis(block: Demo<T>.() -> Unit) = block()

Теперь для типа Demo<T>.() -> Unit: это тип функции.Функция этого типа принимает Demo в качестве аргумента получателя и возвращает Unit.Следовательно, это тип всех функций, определенных либо в классе Demo, либо в качестве расширения класса Demo.

Когда вы предоставляете лямбду этого типа (например, когда вы вызываете doThis function), тогда this будет указывать на 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!")
}
...