kotlin - 带有接收器和链式方法的 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 对象上的方法调用链接有关,但不明白问题是什么。有人可以帮忙吗?
解决方案
我认为你的原件看起来更清晰,更容易理解。而且,如果您在一个月内回来,您会毫无顾虑地添加另一行。为此,您只需要:
inline fun createUtcDate(block: DateTime.() -> Unit): String {
val dateTime = DateTime()
dateTime.apply(block)
return dateTime.toString()
}
推荐阅读
- ceph - 客户端单节点ceph集群无响应
- java - 继续不能应用于 ()
- flutter - Flutter 滚动整个屏幕,包括 gridview
- node.js - AWS SAM 无法构建层
- python - 连接到 localhost db 的 python 中的搜索框
- javascript - 在 MomentJS 中将两个日期与一个日期进行比较
- html - 响应式(移动优先)网站无法正常工作,即使已使用视口和媒体查询
- jenkins - 如何触发构建提交到脚本管道中的分支
- python - Python 入门:如何使用 while 循环获得最大值?
- azure - 使用 Azure 数据工厂对单个 blob CSV 文件进行多个 TeraData cutsom 查询