Scala在自定义类上定义范围的等效方式

Scala在自定义类上定义范围的等效方式,scala,kotlin,Scala,Kotlin,最近查看Kotlin,您可以对一些自定义类执行。或to,而不是Int或其他 Kotlin通过以下扩展功能实现: 接线员fun T.rangeTo(即:T):ClosedRange 这意味着,只要您的类实现了Comparable接口,您就可以免费获得该接口,这样您就可以: val now=LocalDate.now() 瓦尔假期=现在..现在.星期四(10) 我发现那很方便。只是想知道我们如何在Scala中实现它,我知道我们应该通过类型类来实现它?也许是对的,也许是错的 有人能告诉我在Sc

最近查看Kotlin,您可以对一些自定义类执行
to
,而不是
Int
或其他

Kotlin通过以下扩展功能实现:

接线员fun T.rangeTo(即:T):ClosedRange
这意味着,只要您的类实现了
Comparable
接口,您就可以免费获得该接口,这样您就可以:

val now=LocalDate.now()
瓦尔假期=现在..现在.星期四(10)

我发现那很方便。只是想知道我们如何在Scala中实现它,我知道我们应该通过类型类来实现它?也许是对的,也许是错的


有人能告诉我在Scala中最简单的方法吗?看起来至少没有内置的
LocalDate

Scala没有像Kotlin
Range
那样提供间隔类。有几种选择:

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

您可以始终使用旧的pimp my library模式向感兴趣的类添加类似于
范围的方法

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[]
,因为上面说
Range
是“索引序列的一个特例”,所以它似乎是合适的。

是的,它是这样的,只适用于
Int
:Scala
Range
是一个容器,而不是间隔