Почему бы не предоставить оператора?: в scala

В Java существует оператор ? :, который может использоваться для выбора значения в соответствии с логическим выражением. Например, выражение 3 > 2 ? "true" : false вернет строку "true". Я знаю, что мы можем использовать выражение if, чтобы сделать это, но я предпочту этот стиль, потому что он краткий и элегантный.

Ответы

Ответ 1

В Java существует разница между if и ? :, и это означает, что if является выражением, а ? : - выражением. В Scala, if также является выражением: оно возвращает значение, которое можно, например, назначить переменной.

if в Scala гораздо больше похож на ? : в Java, чем на if в Java:

// In Scala 'if' returns a value that can be assigned to a variable
val result = if (3 > 2) "yes" else "no"

Вы не можете сделать это в Java:

// Illegal in Java, because 'if' is a statement, not an expression
String result = if (3 > 2) "yes" else "no"

Поэтому нет необходимости иметь ? : в Scala, потому что он будет точно таким же, как if, но с альтернативным (более неясным) синтаксисом.

Ответ 2

Чтобы добавить к тому, что сказал @Jesper, если вы находите if - else слишком многословным, Scalaz предоставляет еще две альтернативы террас: тройной логический оператор (?, |) a la C-подобные языки, и fold.

scala> import scalaz._
import scalaz._

scala> import Scalaz._
import Scalaz._

scala> (3 > 2) ? "True" | "False"
res59: java.lang.String = True

scala> (3 > 2).fold("True", "False")
res60: java.lang.String = True

Ответ 3

В приблизительном порядке важности:

1) Символ : зарезервирован для аннотации типа

2) В Scala символы могут использоваться как идентификаторы имен методов и значений. Их можно использовать только на ограниченном количестве на стандартной клавиатуре, поэтому, если вы решили сделать два из них по ключевым словам, вы уменьшите пул операторов, которые могут быть использованы (см. Сноску, почему они должны быть ключевыми словами )

3) Как говорит Йеспер, более мощные if/else уже выполняют эту роль, поэтому коэффициент усиления является маргинальным

4) Scala также имеет сопоставление с образцом, которое выполняет аналогичную роль с ключевым словом match в гораздо более общем виде. Например. что, если ваше выражение оценивает что-то, что не является логическим?

5) Это добавит дополнительную сложность компилятора. Scala предпочитает простоту и единообразие в особых случаях

6) Это похмелье от C и действительно довольно странный синтаксис. Scala имеет достаточно странный синтаксис


Сноска: Хотя возможно разработать разумную схему эмуляции ? : в качестве методов (см. Тройная передача оператора), это не так жизнеспособно, как ключевые слова. Сложно обрабатывать типизацию, когда "истинные" и "ложные" альтернативы имеют разные числовые типы, приоритет оператора - проблема, поскольку вам нужны операторы с более низким приоритетом чем что-либо другое (или вы должны использовать круглые скобки), и производительность, скорее всего, пострадает из-за существования среды выполнения.