Scala эквивалентный способ Range для пользовательского класса

Недавно посмотрел на Kotlin, и вы можете сделать .. или на некоторые пользовательские классы вместо Int или других.

Kotlin достигает этого, используя следующую функцию расширения: operator fun <T: Comparable<T>> T.rangeTo(that: T): ClosedRange<T> что означает, что если ваш класс реализует интерфейс operator fun <T: Comparable<T>> T.rangeTo(that: T): ClosedRange<T> вы можете получить это бесплатно, так что вы можете сделать: val now = LocalDate.now() val vacation = now..now.plusDays(10)

Я нашел, что это довольно удобно. Просто интересно, как мы можем это сделать в Scala, я знаю, как-то мы должны достичь этого через класс классов? Возможно, правильно или неправильно.

Может ли кто-нибудь показать мне самый простой способ сделать это в Скале? Похоже, нет встроенного, по крайней мере, для LocalDate

Ну, вы всегда можете использовать старый шаблон 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[] потому что в документах Scala указано, что Range является «особым случаем индексированной последовательности», поэтому он казался подходящим.

Scala не предоставляет интервалы, такие как класс Kotlin Range . Существует несколько альтернатив:

  • Напишите свой собственный класс интервалов
  • Использовать диапазон гуавы
  • Используйте кортеж как диапазон, но управляйте им самостоятельно
Intereting Posts
Как создать пакетные функции? Kotlin: Как проверить, имеет ли число десятичные точки (решение модуля не работает) Android Studio бросает java.lang.ClassNotFoundException при запуске кода Kotlin Как определить объект внутри запечатанной общей иерархии? Круговая анимация не воспроизводится Зачем использовать разницу между объявлением и сайтом Почему плагин Kotlin добавляет ссылку kotlin-stdlib-jre7 (не kotlin-stdlib) для Android-проекта EventBus с Kotlin не работает NoSuchMethodError с использованием Kotlin с новой привязкой данных Android Проблемы с загрузкой изображений в Firebase Назначение отдельного элемента атрибуту значения IntArray в аннотациях Kotlin Невозможно создать частные классы с одинаковым именем в разных модулях Kotlin: параметр типа Reified делает Gson неудачным Dokka – пропустить генератор javadoc для пакетов по умолчанию для Android У Kotlin есть array.indexOf, но я не могу понять, как это сделать array.indexOfBy {lambda}