自定义类

时间:2017-07-17 06:14:33

标签: scala kotlin

最近查看Kotlin,您可以在某些自定义类而不是..或其他类别上执行toInt

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

2 个答案:

答案 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那样提供类别的间隔。有几种选择:

  • 编写自己的间隔类
  • 使用番石榴系列
  • 使用元组作为范围,但自己管理