Проблема с троичным оператором в сложенном виде - PullRequest
1 голос
/ 11 октября 2019

Рассмотрим простую коллекцию с поиском минимума и максимума за одну итерацию:

val v = Vector (2, 1, 3, 5, 4)
val mima = (v(0), v(0))
val mami = (mima /: v) {case ((a, b), c) => if (c<a) (c, b) else if (c>b) (a, c) else (a, b)}

Пока все просто. Если я заменю if / else на троичный оператор (X? Y: Z), это не сработает;Я получаю сообщение об ошибке:

    val mami = (mima /: v) {case ((a, b), c) => (c<a) ? (c, b) : (c>b) ? (a, c) : (a, b)}
<console>:1: ';' expected but : found. 

в последнем двоеточии. Добавление паренов не помогло:

    val mami = (mima /: v) {case ((a, b), c) => (c<a) ? (c, b) : ((c>b) ? (a, c) : (a, b))}

Я совершил глупую ошибку или есть небольшая проблема с вложенным троичным оператором?

Разыскивая эту проблему, она не связана со складками, только:

if (c < 4) "small" else if (c > 8) "big" else "medium"

работает

(c < 4) ? "small" : (c > 8) ? "big" : "medium" 

не удается аналогичным образом.

Ответы [ 2 ]

4 голосов
/ 11 октября 2019

Scala не имеет троичного оператора, потому что он имеет if, который работает как выражение, поэтому вы можете делать такие вещи, как:

val result = if (c < 4) "small" else if (c > 8) "big" else "medium"

Вы также можете использовать его в сложенном виде:

val mami = (mima /: v) {case ((a, b), c) => if (c<a) (c, b) else if (c>b) (a, c) else (a, b)) }
1 голос
/ 11 октября 2019

Ха-ха, извините, ребята!

Простое решение: в Scala нет оператора elvis. :) Ну и дела, как я мог забыть это?

(a < 4) ? foo : bar 

не намного короче чем

if (a < 4) foo; else bar

, и в отличие от Java, Scala возвращает значение из if / elseзаявление, следовательно, вам это не нужно.

...