Scala在自定义类上定义范围的等效方式
最近查看Kotlin,您可以对一些自定义类执行Scala在自定义类上定义范围的等效方式,scala,kotlin,Scala,Kotlin,最近查看Kotlin,您可以对一些自定义类执行。或to,而不是Int或其他 Kotlin通过以下扩展功能实现: 接线员fun T.rangeTo(即:T):ClosedRange 这意味着,只要您的类实现了Comparable接口,您就可以免费获得该接口,这样您就可以: val now=LocalDate.now() 瓦尔假期=现在..现在.星期四(10) 我发现那很方便。只是想知道我们如何在Scala中实现它,我知道我们应该通过类型类来实现它?也许是对的,也许是错的 有人能告诉我在Sc
。
或to
,而不是Int
或其他
Kotlin通过以下扩展功能实现:
接线员fun T.rangeTo(即:T):ClosedRange
这意味着,只要您的类实现了Comparable
接口,您就可以免费获得该接口,这样您就可以:
val now=LocalDate.now()
瓦尔假期=现在..现在.星期四(10)
我发现那很方便。只是想知道我们如何在Scala中实现它,我知道我们应该通过类型类来实现它?也许是对的,也许是错的
有人能告诉我在Scala中最简单的方法吗?看起来至少没有内置的
LocalDateScala没有像KotlinRange
那样提供间隔类。有几种选择:
- 编写自己的间隔类
- 使用番石榴系列
- 使用元组作为范围,但自己管理它
您可以始终使用旧的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
:ScalaRange
是一个容器,而不是间隔