3

我遇到了一个奇怪的错误,我无法弄清楚它为什么会发生。如果我调用我的原始函数,roundToMidnight()则不会调用并且日期不会四舍五入。

我原来的功能,什么不起作用:

suspend operator fun invoke(reference: Reference) = reference.tagId
    ?.let { tagRepository.getTag(it) }
    ?.uploadDate ?: Date()
    .apply { time += accountRepository.getAccount().first().defaultExpiryPeriod }
    .roundToMidnight()
}

有什么作用:

suspend operator fun invoke(reference: Reference): Date {
    val date = reference.tagId
        ?.let { tagRepository.getTag(it) }
        ?.uploadDate ?: Date()
        .apply { time += accountRepository.getAccount().first().defaultExpiryPeriod }
    return date.roundToMidnight()
}

roundToMidnight()返回一个新的实例Date

fun Date.roundToMidnight(): Date {
    val calendar = Calendar.getInstance()

    calendar.time = this
    calendar[Calendar.HOUR_OF_DAY] = 23
    calendar[Calendar.MINUTE] = 59
    calendar[Calendar.SECOND] = 59
    calendar[Calendar.MILLISECOND] = 0

    return Date(calendar.timeInMillis)
}

是什么导致这两种功能的差异?我会说它们完全一样,我看到自己在一个月内将无错误功能重构为原始功能,因为我忘记了这种情况。

4

1 回答 1

0

正如 Egor 所建议的,表达式体并不总是最好的解决方案。改写成这样。

suspend operator fun invoke(reference: Reference): Date {
    val tag = reference.tagId?.let { tagRepository.getTag(it)}
    val uploadDateOrNow = tag?.uploadDate ?: Date()

    uploadDateOrNow.time += defaultExpiryPeriod()
    return uploadDateOrNow.roundToMidnight()
}

private suspend fun defaultExpiryPeriod() = accountRepository
    .getAccount().first()
    .defaultExpiryPeriod

做一个我自己和男孩的项目,我是否会想念在 PRs 中被批评的一段时间。

于 2020-06-07T20:18:35.190 回答