为什么Kotlin中没有支持ClosedRange包含判断的in运算符?
问题解答
1. 该情况是Android/Kotlin团队的设计疏漏吗?
不是。Kotlin标准库的ClosedRange定位是通用基础接口,仅要求实现最基础的元素所属判断能力。区间嵌套包含的规则在不同业务场景下存在差异(比如边界是否算包含、离散区间是否要求步长一致等),不属于通用基础能力范畴,因此标准库没有默认实现。
2. 这是否是有意的设计决策?是否存在不符合直觉的行为?
是有意的设计决策。Kotlin的设计原则是避免在通用基础类中预设存在歧义的实现,防止不同业务场景下出现不符合预期的行为。
这个设计确实存在不符合直觉的点:多数开发者会默认认为in关键字天然支持区间嵌套判断,第一次遇到编译报错时容易困惑。
3. 若为有意设计,最优的规避方案是什么?
根据使用场景选择即可:
- Android开发且已依赖core-ktx:使用
toRange()方案即可,注意使用前先校验区间有效性,遇到负区间先调整为正向:// 先调整为正向区间再转换 val validRange = if (b >= a) a..b else b..a val targetRange = if (y >= x) x..y else y..x val isContained = validRange.toRange() in targetRange.toRange() - 跨平台/不想依赖AndroidX:自行给
ClosedRange扩展符合自身业务逻辑的contains操作符即可:
扩展完成后直接写// 可根据业务需求调整边界判断逻辑,比如左闭右开场景可修改end的判断规则 operator fun <T : Comparable<T>> ClosedRange<T>.contains(other: ClosedRange<T>): Boolean { return this.start <= other.start && other.endInclusive <= this.endInclusive }a..b in x..y即可正常运行。
内容的提问来源于stack exchange,提问作者m.reiter
相关产品推荐
相关产品推荐

