установить игнорировать значение регистра в выражении когда для строк - PullRequest
1 голос
/ 26 октября 2019

Я знаю, как проверить, что строка находится в другой строке, подобной этому коду.

when (myString) {
        in "FirstString"  -> {
                // some stuff
        }
        in "SecondString" -> {
                // some stuff
        }
        else -> {
                // some stuff
        }
}

in ключевое слово под капотом вызывает этот метод CharSequence.contains(other: CharSequence, ignoreCase: Boolean = false)

вопрос такой:

есть ли способ, которым в этом случае я могу установить ignoreCase = true?

Ответы [ 2 ]

3 голосов
/ 26 октября 2019

Вы можете объявить специальную локальную операторную функцию contains для строк до when:

fun main() {

    operator fun String.contains(other: String): Boolean = this.contains(other, ignoreCase = true)

    when(myString) {
        in "firstString" -> ...
    }
}

Таким образом, эта функция будет вызываться для оператора in вместо той, которая объявлена ​​встандартная библиотека, потому что она находится в более близком объеме.

Обратите внимание, однако, что этот прием работает только в том случае, если исходная функция contains является расширением. Если это функция-член, ее нельзя переопределить расширением.

0 голосов
/ 26 октября 2019

Вы можете использовать функцию toLowerCase () здесь:

when (myString.toLowerCase()) {
    in "firststring"  -> {
            // some stuff
    }
    in "secondstring" -> {
            // some stuff
    }
    else -> {
            // some stuff
    }
}

Для случаев when, если они переменные toLowerCase() потребностибыть призванным на каждого из них. Но, если они константы , простое использование строчных букв будет работать - "firststring", "secondstring"

...