2017-07-17 71 views
1

最近看Kotlin,你可以做一些自定義類..to而不是Int或其他。斯卡拉等值方式的範圍上自定義類

科特林實現了通過擴展功能如下: 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

回答

1

那麼你可以總是使用舊的皮條客,我-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 docsRange是那麼它似乎是適當的 「索引序列的特例」。

1

斯卡拉不提供像Kotlin Range類間隔。有幾種選擇:

  • 自己寫的間隔類
  • 使用番石榴範圍
  • 使用元組的範圍,但管理它自己
+0

是的,它只是爲'Int'設置:http://www.scala-lang.org/api/2.12.2/scala/collection/immutable/Range.html –

+0

Scala'Range'是一個容器,而不是間隔 –