Котлин: Почему «возвращение» должно быть отменено из «если»? (Рекомендуется студией Android) - PullRequest
0 голосов
/ 22 апреля 2019

Следующий код (упрощенный пример):

/** Determine if a is less than 15 and b is more than 15. **/
fun isFifteenBetween(val a: Int, val b: Int) {
    if((a < 15) && (b > 15)) { return(true) }
    else { return(false) }
}

должен сделать isFifteenBetween(3, 20) return true и isFifteenBetween(20, 3) return false .Тем не менее, я получаю следующую рекомендацию от Android studio (v3.4):

Return should be lifted out of 'if'
Inspection info: This inspection reports if, when and try statements
that can be converted to expressions by lifting a return or an assignment out.
Typical example:

fun foo(arg: Boolean): String {
    when (arg) {
        true -> return "Truth"
        false -> return "Falsehood"
    }
}

Единственный связанный с этим вопрос, который я обнаружил в stackoverflow, это Kotlin: Возврат может быть отменен из 'when' , но, похоже, это не совсем подходит для моего случая.

  1. Как должен быть написан мой код?Я не понимаю, как выражение «когда», предоставленное студией Android, должно соответствовать моему случаю.
  2. Является ли рекомендация студии Android просто вопросом вкуса и комфорта, или это изменит код?в этом случае на самом деле влияет на производительность?
  3. Есть ли какие-либо рекомендации для лучшей практики?

Ответы [ 3 ]

2 голосов
/ 22 апреля 2019

Сообщение довольно ясно:

Эта проверка сообщает, если, когда и попытаться ли операторы, которые могут быть преобразованы в выражения путем отмены возврата или назначения.

И это говорит о том, что:

В Kotlin, если это выражение, то есть возвращает значение.

Вы можетенайти больше здесь: https://kotlinlang.org/docs/reference/control-flow.html#if-expression
В вашем случае вы можете вернуть результат следующим образом:

return if((a < 15) && (b > 15)) true else false

Так вот:

if((a < 15) && (b > 15)) true else false

является выражением и его значениевозвращается return.

Это выражение может быть еще более упрощено (но оно не связано с вашим вопросом):

return (a < 15) && (b > 15)
2 голосов
/ 22 апреля 2019

Официальное соглашение состоит в том, чтобы предпочитать возвращать само выражение: https://kotlinlang.org/docs/reference/coding-conventions.html#using-conditional-statements

При этом пример из android studio должен выглядеть следующим образом:

return when (arg) {
    true -> "Truth"
    false -> "Falsehood"
} 

Это изменит код isFifteenBetween до:

/** Determine if a is less than 15 and b is more than 15. **/
fun isFifteenBetween(val a: Int, val b: Int) {
    return if((a < 15) && (b > 15)) true 
    else false
}

С точки зрения производительности обе альтернативы почти эквивалентны.


На эти ответы моё мнение может немного повлиять.но я думаю, что это более или менее причина.Факт возврата выражения оказывает непосредственное влияние при чтении фрагмента кода.Вы знаете, что результат заявления будет исчерпывающим, и у вас есть информация, что каждый филиал был обработан.

Я считаю, что это лучшая практика, потому что в некоторых случаях создание исчерпывающего условия ветвления может привести к тому, что компилятор выдаст вам ошибку, забыв при этом некоторые новые условия.Больше всего для закрытых классов.Дальнейшее чтение: https://proandroiddev.com/til-when-is-when-exhaustive-31d69f630a8b

0 голосов
/ 22 апреля 2019

В Kotlin , когда заменить switch-operator от java, но основное отличие состоит в том, что , когда является выражением , поэтому может вернуть результат. Чтобы лучше понять, как работает выражение «когда» в Kotlin, вы можете взглянуть на лямбды. Оператор when просто возвращает результат своей 'лямбды' после каждого случая.

Даже если вы напишите

when(a) {
    1 -> println("one")
    else -> println("something else")
}

Эта запись возвращает результат функции println (...), которая возвращает Unit. Поэтому это не лучший способ написать код, когда вы дублируете это «return».

val result = when(a) {
    1 -> println("one")
    else -> println("something else")
}
// and now result equals to Unit-object

Та же история с if-else, это также выражение .

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