最近查看Kotlin,您可以在某些自定义类而不是..
或其他类别上执行to
或Int
。
Kotlin通过以下扩展功能实现了这一目标:
operator fun <T: Comparable<T>> T.rangeTo(that: T): ClosedRange<T>
这意味着只要您的类实现Comparable
接口,您就可以免费获得该接口,这样您就可以:
val now = LocalDate.now()
val vacation = now..now.plusDays(10)
我发现这很方便。只是想知道我们怎么能在Scala中做到这一点,我知道我们应该通过类型类实现它?也许对或错。
有人能告诉我在Scala中执行此操作的最简单方法吗?看起来至少没有内置于LocalDate
答案 0 :(得分:3)
你可以随时使用旧的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[]
,因为the Scala docs表示Range
是&#34;索引序列的特殊情况&#34;所以这似乎是合适的。
答案 1 :(得分:1)
Scala并没有像Kotlin Range
那样提供类别的间隔。有几种选择: