Scala等同于Range的方式来自定义类

最近看Kotlin,你可以做..或者一些自定义类而不是Int或其他类。

Kotlin通过如下扩展函数来实现: operator fun <T: Comparable> T.rangeTo(that: T): ClosedRange这意味着只要你的类实现了Comparable接口,你可以免费得到它你可以这样做: val now = LocalDate.now() val vacation = now..now.plusDays(10)

我发现这很方便。 只是想知道我们怎么能在Scala中做到这一点,我知道我们应该通过types类来实现它吗? 也许是对还是错。

任何人都可以向我展示在Scala中最简单的方法吗? 看起来好像没有内置的LocalDate

那么你总是可以使用旧的pimp-my-library模式来为感兴趣的类添加类似Range的方法。

 import java.time.LocalDate import java.time.temporal.ChronoUnit implicit class LocalDateRange(start: LocalDate) { // Note: LocalDate already has an until() method so can't add that here def to(end: LocalDate): IndexedSeq[LocalDate] = IndexedSeq.iterate( start , ChronoUnit.DAYS.between(start, end.plusDays(1L)).toInt )(_.plusDays(1L)) } 

用法:

 val now = LocalDate.now() val vacation: IndexedSeq[LocalDate] = now to now.plusDays(10) 

我选择了IndexedSeq[]因为Scala文档说Range是“一个索引序列的特例”,所以它看起来是合适的。

斯卡拉不提供类似Kotlin Range间隔。 有几个选择:

  • 写你自己的间隔课
  • 使用番石榴的范围
  • 使用元组作为范围,但自己管理它