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 Back-Tick в именах методов: как это работает? Не удалось найти метод springBoot () для аргументов – Spring Boot с использованием Kotlin Что произошло при запуске кода HashMap (it)? Используя Flux вместо цикла for, какие-либо преимущества? Как создать бесконечно длинную последовательность в Котлине Сбой сборки при использовании «kotlin-kapt» с Realm Kotlin: Reified generics, похоже, не работают правильно для сравнения hash / equals Kotlin – NoSuchMethodError при создании экземпляра Throwable Передача любого в массив в Котлин Работа для администратора устройства api не имеет собственного профиля Проверка значений параметров EditText вызывает сбой Получение исходного ответа HTML / JSON на ошибку с помощью Retrofit 2 и Kotlin Создание классов Kotlin в Android Studio с использованием действий Почему я получаю сообщение @ Provides-annotated? Kotlin: вызывается функция обновления пользовательского интерфейса от BroadcastReceiver onReceive