Почему Котлин не поддерживает "тройного оператора",
Объясните: этот вопрос больше связан с проектными намерениями Котлина. Многие языки выражений поддерживают как Ternary operator
, так и if expression
[например, Ruby, Groovy.]
Прежде всего, я знаю, что Groovy поддерживает как Ternary operator
, так и Elvis operator
: Тернарный оператор в Groovy. Поэтому я не думаю, что это синтаксическая проблема.
Затем в официальных документах говорилось:
В Kotlin, if является выражением, т.е. возвращает значение. Поэтому нет тройного оператора (условие? Then: else), потому что обычный, если отлично работает в этой роли.
И это меня не убеждает. Потому что Kotlin поддерживает Elvis operator
, который обычный, если работает отлично в этой роли.
Я думаю, что Ternary operator
иногда лучше обычного if
, хотя мне интересно, почему Kotlin просто не поддерживает Ternary operator
?
Ответы
Ответ 1
В языках, которые имеют ternary operator
, вы используете его как это
String value = condition ? foo : bar;
В Котлине вы можете сделать то же самое, используя if и else
var value = if(condition) foo else bar;
Его бит многословный, чем ternary operator
. Но дизайнеры Котлина думали, что все в порядке. Вы можете использовать if-else
как это, потому что в Kotlin if
есть выражение и возвращает значение
Elvis operator
по существу является сжатой версией тернарного условного оператора и эквивалентна следующему в Котлине.
var value = if(foo != null) foo else bar;
Но если используется Elvis operator
, оно упрощается следующим образом:
var value = foo ?: bar;
Это значительное упрощение, и Котлин решил сохранить его.
Ответ 2
Потому что if .. else ..
работает нормально. Посмотрите:
fun main(args: Array<String>) {
var i = 2
println("i ${ if(i == 1) "equals 1" else "not equals 1" }")
}
Ответ 3
Тернарный оператор имеет свои проблемы, например, его трудно читать с большими выражениями. Вот строка из моего проекта на С++, где я использовал тернарный оператор:
const long offset = (comm_rank > 0) ? task_size_mod + (comm_rank - 1) * task_size : 0;
Я бы предпочел использовать выражение if else
здесь, так как оно намного более заметно.
Отвечая на вопрос, я знаю две причины, почему ternary operator
не был реализован в Котлине:
1) Так как if else
- выражение, оно может заменить ? :
2) Опыт других языков (С++) показывает, что ? :
вызывает трудночитаемый код, поэтому лучше не учитывать
Ответ 4
Как вы сказали, в Котлине нет ни одного троичного оператора, который бы имел регулярный вид (как в других популярных языках), к которому мы привыкли:
condition ? then : else
Это потому, что в Kotlin обычные операторы if - else
прекрасно работают в этой роли.
Пример 1:
val a = 5
val b = 2
if (a > b) println(a) else println(b)
// Result: 5
Дизайнеры Kotlin предоставили вам аналогичную функциональность, но с более богатым потенциалом.
Пример 2:
val a = 2
val b = 2
if (a > b) {
println(a)
} else if (a == b) {
println("They are equal")
} else {
println(b)
}
// Result: "They are equal"
И, конечно же, Elvis Operator
можно использовать в более элегантных конструкциях с обнуляемыми значениями.
Пример 3:
fun maximum(a: Int?, b: Int) = a ?: b
println(maximum(50,7))
// Result: 50
или, если a
имеет значение null
fun maximum(a: Int?, b: Int) = a ?: b
println(maximum(null,7))
// Result: 7
Надеюсь это поможет.