首页 > 解决方案 > 为什么 Kotlin 中没有 ClosedRange IN ClosedRange 运算符?

问题描述

val a, b, x, y: LocalDate.

Then a..b in x..yis no valid expression:ClosedRange in ClosedRange未定义。

但是,(a..b).toRange() in (x..y).toRange()确实有效,因为Range in Range已定义。

除非 whenb < ay < xsinceranges不能为负数。

请注意,我正在为 Android 开发,这就是.toRange()起源:androidx.core/core-ktx


3 问题出现

标签: androidkotlinrange

解决方案


免责声明:我不是 Android 开发人员,也没有使用 androidx.core 的经验,所以请谨慎回答。

因此,根据 Kotlin文档,假设您可以a..b创建一个 ClosedRange(默认情况下在 Kotlin 标准库中不可用,但 core-ktx 可能为此定义了自己的扩展名),将被翻译为. 现在,定义了一些方法,但它们都不接受另一个作为参数,因此你的错误。x in yy.contains(x)ClosedRangecontainsClosedRange

现在,显然 Android 标准库定义了自己的 概念Range,这与 Kotlin 无关ClosedRange(因为一个不扩展另一个)。但是,core-ktx定义了一个将 a 转换ClosedRange为 a的函数Range,并且该函数是.toRange()。除此之外,Range定义了一个contains(Range)方法,因此第二个示例可以正确编译。

总结一下:Kotlin 不允许 (1) 默认创建日期范围,以及 (2) 检查一个范围是否完全包含在另一个范围中。但是,您可以轻松克服 (1) 通过创建自己的函数来创建ClosedRange日期(通过创建rangeTo扩展函数),以及 (2) 通过创建自己的contains(Range)函数。


回到为什么a..b使用时有效core-ktx,我找不到令人满意的答案。该库包含一个扩展函数,用于从任何(和is-a )rangeTo中创建一个范围,但该函数返回 a ,而不是 a ,所以我不确定为什么首先不起作用。ComparableLocalDateComparableRangeClosedRangea..b in x..y


推荐阅读