android - 为什么 Kotlin 中没有 ClosedRange IN ClosedRange 运算符?
问题描述
让val a, b, x, y: LocalDate
.
Then a..b in x..y
is no valid expression:ClosedRange in ClosedRange
未定义。
但是,(a..b).toRange() in (x..y).toRange()
确实有效,因为Range in Range
已定义。
除非 whenb < a
或y < x
sinceranges
不能为负数。
请注意,我正在为 Android 开发,这就是.toRange()
起源:androidx.core/core-ktx
3 问题出现
- 这是 android / kotlin 团队的疏忽吗?
- 这是一个深思熟虑的决定吗?(例如因为一些不直观的行为)
- 如果这是一个深思熟虑的决定:如何最好地规避它?
解决方案
免责声明:我不是 Android 开发人员,也没有使用 androidx.core 的经验,所以请谨慎回答。
因此,根据 Kotlin文档,假设您可以a..b
创建一个 ClosedRange(默认情况下在 Kotlin 标准库中不可用,但 core-ktx 可能为此定义了自己的扩展名),将被翻译为. 现在,定义了一些方法,但它们都不接受另一个作为参数,因此你的错误。x in y
y.contains(x)
ClosedRange
contains
ClosedRange
现在,显然 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 ,所以我不确定为什么首先不起作用。Comparable
LocalDate
Comparable
Range
ClosedRange
a..b in x..y
推荐阅读
- c# - 更改长按 Sprite 的图像
- javascript - 动态更改谷歌地图街景位置
- java - io.cucumber.core.exception.CucumberException:java.lang.NoClassDefFoundError:io/cucumber/core/plugin/JSONFormatter
- javascript - TypeError:无法读取未定义的属性“待办事项”
- javascript - Firebase Relatime Database:每次添加新孩子时都从多个不同路径检索数据
- python - Python Pygame:未绘制精灵
- python - 在 python 中模拟在函数之外运行命令的脚本
- java - Spring Batch @BeforeContext 执行失败
- java - 在一个 java 文件中为多个包使用多个类
- python - 从 GMT 到 UTC-4 的时区转换