Является ли конструктор функцией в Котлине?

#kotlin

Вопрос:

Я только что наткнулся на класс данных следующим образом.

 class A{
}
 
 sealed class B
 
 data class C(val isNext: Boolean = false, val builder: () -> A): A
 
 class D: A{
}
 

Чтобы создать экземпляр класса, разработчик использовал следующее объявление.

 C{D()}
 

Мое понимание лямбды заключается в том, () -> A что это функция без имени, которая не принимает аргументов и создает экземпляр A, однако, учитывая, что вызывается конструктор A, могу ли я предположить, что это функция?

Комментарии:

1. Да, конструкторы-это такие же функции, как и любые другие. Внутренне они особенные, потому что они, ну, строят объекты, но для внешнего наблюдателя они работают так же, как и любая другая функция.

Ответ №1:

Конструктор-это тип функции, но вы не передаете его здесь как функцию, потому что вы завернули его, вызвав в лямбда-функции. Таким образом, вы передали функцию, которая внутренне вызывает конструктор.

Вы можете передать конструктор непосредственно в виде функции, например:

 val c = C(::D)
 

Ответ №2:

Я привел в порядок твою обстановку:

 open class A
class C(val isNext: Boolean = false, val builder: () -> A) : A()
class D : A()
 

С учетом этого все нижеперечисленное эквивалентно:

     val bldr: () -> A = { D() }

    C { D() }
    // is the same as:
    C(isNext = false, builder = { D() })
    // is the same as:
    C(isNext = false, builder = bldr)

 

Таким образом, лямбда-это просто переменная экземпляра с именем builder C точно так же, как isNext есть. Если она будет вызвана, будет создан новый D , который окажется подклассом A

Ответ №3:

() -> A обозначает функцию, которая принимает нулевые документы и возвращает экземпляр A.

Экземпляр() неявно генерируется лямбдой, отсюда и выражение.