首页 > 解决方案 > 带有接收器和链式方法的 Kotlin 函数文字

问题描述

我试图围绕 Kotlin 中的 Function Literals 进行思考,并遇到了一些我不理解的行为。

以下代码(使用 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 对象上的方法调用链接有关,但不明白问题是什么。有人可以帮忙吗?

标签: kotlin

解决方案


我认为你的原件看起来更清晰,更容易理解。而且,如果您在一个月内回来,您会毫无顾虑地添加另一行。为此,您只需要:

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

推荐阅读