Могу ли я всегда объединять два условия в один ряд в Котлине? - PullRequest
0 голосов
/ 08 ноября 2018

Код A хорош, я надеюсь оптимизировать его, поэтому я пишу Код B.

Я не уверен, всегда ли правильный код В.

Все будет в порядке, если сначала Котлин проверит clipboard.hasPrimaryClip(), а затем clipboard.primaryClipDescription.hasMimeType(MIMETYPE_TEXT_PLAIN).

Это может произойти сбой, если Котлин сначала проверяет clipboard.primaryClipDescription.hasMimeType(MIMETYPE_TEXT_PLAIN), затем clipboard.hasPrimaryClip(), верно?

Код A

clipboard.addPrimaryClipChangedListener {
   if (clipboard.hasPrimaryClip() ) {
          if (clipboard.primaryClipDescription.hasMimeType(MIMETYPE_TEXT_PLAIN)) {

         }
   }
}

Код B

clipboard.addPrimaryClipChangedListener {
  if (clipboard.hasPrimaryClip() && clipboard.primaryClipDescription.hasMimeType(MIMETYPE_TEXT_PLAIN) ) {

  }
}

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Как упоминалось в комментариях, принцип, лежащий в основе этого, описывается как "короткое замыкание":

Оценка короткого замыкания [...] - это семантика некоторых логических операторов в некоторых языках программирования, в которых второй аргумент выполняется или оценивается, только если первого аргумента недостаточно для определения значения выражения.

Это означает, что clipboard.hasPrimaryClip() всегда будет оцениваться. Если это false условие не выполняется, не глядя дальше. Если это true, то clipboard.primaryClipDescription.hasMimeType(MIMETYPE_TEXT_PLAIN) также будет оцениваться.

0 голосов
/ 08 ноября 2018

if условия выполняются последовательно.Это означает, что он сначала проверит левое условие, и если оператор имеет значение AND, а левое условие вернет false, то он не проверит правильное условие.Так что да, вы можете объединить два условия.

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