Присваивать значение переменной, только если не равно нулю - Kotlin

Есть ли в Kotlin чистый способ присвоить значение переменной, только если значение не равно нулю?

Мой пример:

if (x != null)
   y = x

Я нашел решение вроде

y = x? : return

но я не понимаю, делает ли это то, что я хочу, и как работает этот оператор.

Если вам нужно установить свойство, можно переопределить сеттер по умолчанию, например var y: Int? = 0 set(x: Int?) { if (x != null) field = x }

user8320224 15.05.2018 10:21

@ user8320224 проблема с этим решением заключается в том, что y, вероятно, является ненулевым полем, следовательно, проверка допустимости значения NULL перед назначением.

Pawel 15.05.2018 21:28
Укрывает ли JavaScript ошибку с самого начала?
Укрывает ли JavaScript ошибку с самого начала?
Typeof(null) → Ошибка в том, что он возвращает тип Object, в то время как ожидается, что он вернет тип null. Эта ошибка - ситуация, пришедшая из...
22
2
13 765
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Оператор называется «Оператор Элвиса». Он оценивает, не является ли x нулевым, и если это правда, назначает x на y. Если он равен нулю, он оценивает оператор после вопросительного знака, немедленно возвращается и, следовательно, оставляет y нетронутым.

К сожалению, решение было «y = x?: Return», а не x = y?: Return. Это решение сработало для меня «y = x?: Return». Теперь я понимаю оператора Элвиса благодаря твоему описанию. Можете ли вы исправить свой ответ для правильного решения? ... Моя ошибка.

BlueSeph 15.05.2018 00:02

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

still_dreaming_1 31.01.2020 15:29

Другое решение, если вы пока не хотите возвращаться из функции:

x?.let{ y = it }

Что проверяет, не является ли x ненулевым, а затем передает его в качестве единственного параметра лямбда-блоку.

Это также безопасный вызов, если ваш x - это var.

Каким будет однострочный способ присвоить X <или значение по умолчанию> Y, только если Y равно нулю или если оно равно нулю (соответственно типам X и Y String / int)?

Hugo Allexis Cardona 05.04.2020 23:40

Да, работает, но это уродливый!

SMBiggs 25.03.2021 05:11

Ваш код такой же, но с меньшим написанием:

if (x != null)
    y = x
else
    return

При использовании оператора Elvis оператор if else сокращается до:

y=x ?: return

Если левая сторона истинна (x не равно нулю), тогда будет присвоено y, иначе будет выполнена правая сторона.

Для тех, кто ищет и хочет решение, которое немедленно возвращает нет. Можно зажать нос и сделать так:

y = x ?: y

Как хороший программист, мне не терпится присвоить переменную самой себе, чтобы удовлетворить синтаксису. Но это же котлин для тебя! Эти дизайнеры продумали все!

Другие вопросы по теме