Тест Котлина, находится ли поплавок в открытом или полуоткрытом диапазоне - PullRequest
0 голосов
/ 11 февраля 2019

В Kotlin - есть ли идиоматический способ проверить, находится ли число с плавающей точкой в ​​диапазоне, где либо (или оба) начало или конец диапазона является эксклюзивным?

Например, что-то вроде

val inRange = 10.f in (0.0f until 20f)

Кажется, я не могу найти что-либо об этом в документации

Обновление: как можно справиться и с полуоткрытыми диапазонами?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Вдохновленный тем, что я выбрал в качестве ответа, я придумал это решение, разместив его здесь, если кто-то захочет его использовать.

class Range(private val fromInclusive: Boolean, val from: Float, val to: Float, private val toInclusive: Boolean) {

    infix fun contains(value: Float): Boolean {
        return when {
            fromInclusive && toInclusive -> value in from..to
            !fromInclusive && !toInclusive -> value > from && value < to
            !fromInclusive && toInclusive -> value > from && value <= to
            fromInclusive && !toInclusive -> value >= from && value < to
            else -> false
        }
    }
}

Использование: val inRange = Range(true, 0f, 10f, false) contains 5f

0 голосов
/ 11 февраля 2019

Функция until создает полузамкнутый целочисленный (не плавающий) диапазон, в котором левая часть включена, а правая часть исключена.https://kotlinlang.org/docs/reference/ranges.html

В Колтине есть поддержка закрытых диапазонов с плавающей точкой https://kotlinlang.org/docs/reference/ranges.html#utility-functions

Вы можете реализовать это сами

data class OpenFloatRange(val from: Float, val to: Float)
infix fun Float.open(to: Float) = OpenFloatRange(this, to)
operator fun OpenFloatRange.contains(f: Float) = from < f && f < to

val inRange = 10f in (0.0f open 20f)

Здесь я использую несколько трюков из Kotlin: https://kotlinlang.org/docs/reference/functions.html#infix-notation https://kotlinlang.org/docs/reference/operator-overloading.html#in

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...