Если оба выражения оператора Элвиса имеют нулевое значение, какое из них выбрано? - PullRequest
0 голосов
/ 12 мая 2018

например:

var str: String? = null
str ?: null

Когда run возвращает ноль, но какой? Я не предвижу для этого никакой практической цели - мне просто любопытно.

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Ответ, который вы ищете, - это значение с правой стороны, и это именно то, что мы ожидаем.Тот факт, что оба они равны нулю, не имеет никакого отношения к порядку, в котором они оцениваются, у Котлина есть контракт, и он его придерживается.

Если я наберу ваш код в моем редакторе, я получу предупреждение, что "Правый операнд оператора elvis (? :) бесполезен, если он нулевой ", что мне кажется правильным.Чтобы обойти это, давайте заменим левые и правые части на функции, которые вместо этого возвращают нуль ...

fun alwaysReturnsNull(log: String): String? {
    println(log)
    return null
}

val str: String? = alwaysReturnsNull("first") ?: alwaysReturnsNull("second")
println(str)

В этом случае вывод «первый», затем «второй», показываячто Котлин оценивает значения этих функций в порядке, который вы ожидаете: левая рука элвиса, а затем правая рука элвиса.

0 голосов
/ 12 мая 2018

Оператор elvis работает следующим образом: если левый операнд оценивается как null, правый операнд используется.Смотрите этот ответ .

. В вашем случае выбирается правильное null, но использовать его таким образом совершенно бесполезно.Использование оператора elvis имеет смысл, только если вы предоставляете ненулевые альтернативы соответствующему левому операнду.

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