Функциональный литерал Котлина с приемником и цепочечными методами - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь обернуть голову вокруг функциональных литералов в Kotlin и столкнулся с некоторым поведением, которое я не понимаю.

Следующий код (с использованием JodaTime) даст желаемый результат 2017-11-24T00: 00: 00.000Z '

val dateTime = DateTime()
val withTimeAtStartOfDay = dateTime
        .minusYears(1)
        .withTimeAtStartOfDay()

println(withTimeAtStartOfDay.toString())

Чтобы попытаться воспроизвести это в DSL, я создал следующую функцию

inline fun createUtcDate(block: DateTime.() -> DateTime): String {
    val dateTime = DateTime()
    return dateTime.block().toString()
}

Вызов этой функции с помощью следующего кода дает результат'2018-11-24T00: 00: 00.000Z', где, как вы можете видеть, применяется только вызов withTimeAtStartOfDay().

val utcDate = createUtcDate {
    minusYears(1)
    withTimeAtStartOfDay()
}
println(utcDate)

Я предполагаю, что это как-то связано с цепочкой вызовов методов для объекта DateTime, но я не понимаю, в чем проблема.Может кто-нибудь помочь?

1 Ответ

0 голосов
/ 24 ноября 2018

Я думаю, что ваш оригинальный вид гораздо более разборчивый и легче для понимания.И, если вы вернетесь через месяц, вы добавите еще одну строку, не беспокоясь.Для этого вам нужно всего лишь:

inline fun createUtcDate(block: DateTime.() -> Unit): String {
    val dateTime = DateTime()
    dateTime.apply(block)
    return dateTime.toString()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...