Неправильный синтаксис условия при использовании котлина - PullRequest
0 голосов
/ 24 июня 2018

это синтаксическая ошибка

 in "C","c".."Z","z"->{//erorr:ClosedRange
        print("Last")
    }

но это работает, почему?

in "C".."Z","z"->{
        print("Last")
    }

Ответы [ 3 ]

0 голосов
/ 24 июня 2018

Просто, чтобы сделать вещи более сложными (это, конечно, не ответ), если вы запустите следующий код:

val c = "California"

when (c) {
    in "A".."z"-> {
        print("Yes")
    }
    else -> {
        print("No")
    }
}

как вы думаете, что будет напечатано? Yes потому что "A"<"California"<"z"

Так что будьте очень осторожны с диапазонами строк.

0 голосов
/ 25 июня 2018

Это просто делает ответ zsmb13 более четким, но не вписывается в комментарий.

В вашей первой версии компилятор видит 3 условия: in "C", "c".."Z" и "z". Первый действителен, например, для String, потому что он вызывает метод String.contains(String). Второй проверяет, равен ли аргумент when диапазону "c".."Z", а третий - равен ли он строке "z".

Так что, если компилятор может сказать, что аргумент не является ClosedRange (поскольку String не может быть ClosedRange), то он не может быть равен "c".."Z", и условие может ' т успеха.

0 голосов
/ 24 июня 2018

Вторая версия работает, потому что вы можете перечислить несколько условий, которые будут выполнять одну и ту же ветку кода.in "C".."Z" является условием для значения, находящегося в диапазоне, в то время как "z" является условием для значения, являющегося точно "z".

Вы также можете делать то, что искали, если вы перечисляетедва диапазона условий отдельно:

when(x) {
    in "C".."Z", in "c".."z" -> {
        /* Runs when value is in either range */
    }
    2, 4, 9 -> { 
        /* Another example of multiple conditions for the same 
           branch (only one has to match, of course) */
    } 
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...