В Java есть оператор ? :
, который можно использовать для выбора значения в соответствии с логическим выражением. Например, выражение 3 > 2 ? "true" : false
вернет строку "true"
. Я знаю, что для этого можно использовать выражение if
, но я предпочитаю этот стиль, потому что он лаконичен и элегантен.
Почему бы не предоставить оператора? : в скале
Ответы (3)
В 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
, но с альтернативным (более неясным) синтаксисом.
?
конфликтует с синтаксисом ask
актеров.
- person Arne Claassen; 07.07.2014
?
и :
в первую очередь противоречили друг другу? Как ? :
для тернарного условного оператора менее удобочитаем, чем ?
для запроса (как читаемость, если его часто называют причиной такого дизайна)?
- person Michal M; 02.11.2015
Чтобы добавить к тому, что сказал @Jesper, если вы находите if
-else
слишком многословным, Scalaz предлагает еще две более краткие альтернативы: троичный логический оператор (?
, |
) в стиле 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
fold
? Это не похоже на фолд FP.
- person Dan Burton; 24.11.2011
Примерно в порядке важности:
1) Символ :
зарезервирован для аннотации типа
2) В Scala символы могут использоваться как идентификаторы для имен методов и значений. Их количество на стандартной клавиатуре ограничено, поэтому, если вы решите превратить два из них в ключевые слова, вы уменьшите количество операторов, которые можно использовать (см. сноску, почему они должны быть ключевыми словами). )
3) Как говорит Джеспер, более мощные if
/else
уже выполняют эту роль, так что выигрыш незначителен
4) Scala также имеет сопоставление с образцом, которое выполняет аналогичную роль с ключевым словом match
в гораздо более общем виде. Например. что, если ваше выражение оценивается чем-то, что не является логическим значением?
5) Это добавило бы дополнительной сложности компилятору. Scala предпочитает простоту и единообразие частным случаям
6) Это пережиток C и действительно довольно странный синтаксис. У Scala достаточно странный синтаксис
Сноска. Хотя можно придумать разумную схему для имитации ? :
как методов (см. ввод тернарного оператора), это не так же жизнеспособны, как ключевые слова. Сложно правильно обрабатывать типизацию, когда альтернативы «истина» и «ложь» имеют разные числовые типы, приоритет оператора равен проблема, поскольку вам нужны операторы с более низким приоритетом, чем что-либо еще (иначе вам придется использовать круглые скобки), и производительность, вероятно, пострадает из-за характера реализации во время выполнения.
?:
->if/else
... но вопрос, как он сформулирован, не совсем соответствует правилам часто задаваемых вопросов. - person   schedule 23.11.2011if/else
действительно не вписывается в это. Это просто мое мнение, но удаление чего-то стандартного, такого как тернарный оператор, который присутствует в java, php, c, c++ и т. д., — это разочаровывающая ошибка, с которой, как мне кажется, сталкивается множество людей. - person EdgeCaseBerg   schedule 07.08.2015