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

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


person 爱国者    schedule 23.11.2011    source источник
comment
Почему бы вам не спросить разработчиков Scala? Это единственные люди, которые действительно знают... и вам нужно заставить их передумать.   -  person Stephen C    schedule 23.11.2011
comment
Здесь есть старый вопрос о тернарном операторе в scala: stackoverflow.com/ вопросы/4947535/тернарный-оператор-аналог   -  person flesk    schedule 23.11.2011
comment
Не собираюсь закрывать, просто потому, что другие могли бы установить связь ?: -> if/else... но вопрос, как он сформулирован, не совсем соответствует правилам часто задаваемых вопросов.   -  person    schedule 23.11.2011
comment
IMO отсутствие тернарного оператора - плохое решение разработчиков scala, если они надеются, что люди из java и других языков легко перейдут на его использование. Когда я собираюсь написать некоторую условную интерполяцию в строке, я хочу использовать тройную для краткости, if/else действительно не вписывается в это. Это просто мое мнение, но удаление чего-то стандартного, такого как тернарный оператор, который присутствует в java, php, c, c++ и т. д., — это разочаровывающая ошибка, с которой, как мне кажется, сталкивается множество людей.   -  person EdgeCaseBerg    schedule 07.08.2015


Ответы (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, но с альтернативным (более неясным) синтаксисом.

person Jesper    schedule 23.11.2011
comment
Кроме того, : конфликтует с синтаксисом ввода - person Neil Essy; 23.11.2011
comment
И ? конфликтует с синтаксисом ask актеров. - person Arne Claassen; 07.07.2014
comment
Тогда зачем проектировать язык так, чтобы ? и : в первую очередь противоречили друг другу? Как ? : для тернарного условного оператора менее удобочитаем, чем ? для запроса (как читаемость, если его часто называют причиной такого дизайна)? - person Michal M; 02.11.2015
comment
тернарный оператор не является неясным. миллионы разработчиков C, C++ и Java понимают синтаксис. утверждение, что оно неясно, является мнением, противоречащим доказательствам. - person ChuckCottrill; 29.09.2016
comment
@ChuckCottrill Есть несколько определений слова неясный. Среди них трудно понять (источник). Бесспорно, код, написанный с помощью тернарного оператора в стиле C, сложнее читать. - person Brian McCutchon; 14.09.2017

Чтобы добавить к тому, что сказал @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
person missingfaktor    schedule 23.11.2011
comment
Какова причина называть его fold? Это не похоже на фолд FP. - person Dan Burton; 24.11.2011
comment
@DanBurton: Вы можете найти ответ здесь. - person missingfaktor; 24.11.2011
comment
@missingfaktor: ссылка не работает... - person tutuca; 28.03.2014
comment
@tutuca, вот новая ссылка - tmorris.net/posts/debut- with-a-catamorphism/index.html. - person missingfaktor; 03.05.2014

Примерно в порядке важности:

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

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

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

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

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

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


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

person Luigi Plinge    schedule 23.11.2011