Почему Котлин не поддерживает "тройного оператора",

Объясните: этот вопрос больше связан с проектными намерениями Котлина. Многие языки выражений поддерживают как 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

Надеюсь это поможет.