Умовний оператор у Coffeescript


74

Мені це дуже подобається:

var value = maxValue > minValue ? minValue : maxValue;

Чи є щось настільки ж лаконічне в Coffescript?


8
Щиро дякую, що не назвали його "потрійним оператором".
Mark Wilden

4
@MarkWilden, чому б і не? це встановлений термін
Стефан

1
Якщо ви шукаєте тернарний оператор для coffescript, ви знайдете його відразу.
william.eyidi

@MarkWilden: Ви отримали 5 голосів проти, тому, здається, чимало людей погоджуються з вами, але чи не поясніть, будь ласка, чому?
Заз,

3
"Проблема з" потрійним оператором "полягає в тому, що він описує, як він виглядає, а не те, що робить ". - Ерік Ліпперт, blogs.msdn.com/b/ericlippert/archive/2010/02/18/… (у коментарі)
Джо Вайт

Відповіді:


140
value = if maxValue > minValue then minValue else maxValue

10
Ви також можете зробити це: value = `maxValue > minValue ? minValue : maxValue`
Пітер Крнєвіч

1
@PeterKrnjevic: Можливо, ви захочете змінити свій коментар на відповідь :) При тій же кількості символів, але менш читабельній, на мій погляд, це також працює: stackoverflow.com/a/23915351/750216
Резван Флавій Панда

1
Якщо ви вважаєте правильним рішенням: value = Math.min minValue, maxValue
расхадафі

Гаразд, як тепер ви пишете це у декілька рядків? Будь-який інший спосіб, крім використання знака продовження рядка ``?
jimasun

21

Існує більш стислий варіант як у javascript, так і в coffeescript :)

value = Math.min(minValue, maxValue)

12
в каві value = Math.min minValue, maxValue,;)
v42

4
Я не думаю, що питання стосувалося фактичного змісту, а здатності робити все це в одному рядку. Однак може бути помилковим.
LasagnaAndroid

1
Неправильно, оскільки це не стосується питання. ОП запитує про Conditional operator in Coffeescriptте, як це написати, подаючи JSприклад. Це лише приклад і не має нічого спільного з фактичною проблемою синтаксису.
jimasun

12

Як зазначає Резван Панда, мій коментар насправді може бути однією з кращих відповідей:

value = `maxValue > minValue ? minValue : maxValue`

Яка функція лапок у вашому рядку коду?
Матьє Брауерс,

Зворотні позначки змушують рядок виконуватися до призначення.
Пітер Крнєвіч

10

Це випадок, коли здається, що CoffeeScript має конкуруючі філософії:

  1. Будьте лаконічними
  2. Не будь зайвим

Оскільки всі операції повертають результат, спосіб дії if / then / else дає вам те, що вам потрібно. Додавання оператора? /: Зайве.

Тут я хотів би, щоб вони дали нам тернарний оператор? /:, Хоча він надлишковий ... він просто читається краще, ніж варіант if / then / else.

Тільки моя 2c.


20
Немає можливості отримати a ? b : cтернар у CoffeeScript без однозначності, оскільки він a ? bмає значення (" aякщо воно не є нульовим, bінакше), а також b: cмає його також ( {b: c}).
Тревор Бернхем,

3

Ви можете написати це так:

value = if maxValue > minValue then minValue else maxValue

Він буде компілюватися як ваш код.


3

Нижче наводиться той факт:

У документації є розділ під назвою "Умовники, тернари та умовне призначення" . Це наводить на думку, що coffeescript підтримує

condition ? when-true : when-false 

але насправді це не так.

Нижче наведена інформація про патч, який вирішить цю проблему

Ось патч (і він перенесений на coffeescript.org ):

http://github.com/jashkenas/coffee-script/commit/ec2d358ae3c82e9888c60695d7cce05edde0c55a

Приклади:

mood = greatlyImproved if singing

if happy and knowsIt
  clapsHands()
  chaChaCha()
else
  showIt()

date = if friday then sue else jill

options or= defaults

2
if then else є потрійною операцією, вона просто має інший синтаксис.
Рікардо Томасі,

у кавовому сценарії, якщо ще твердження написано в одному рядку
Сіва Чаран,

1
я мав на увазі те, що потрійна операція визначається як операція з трьома елементами . Однолінійне if then elseтвердження класифікується як потрійне . Правильний термін для «потрійного» оператора в javascript - це умовний оператор .
Рікардо Томасі,

-1
value = maxValue > minValue && minValue || maxValue

Це насправді не правильно, перевірте коментарі.


1
Це не дає відповіді на запитання. Щоб критикувати або вимагати роз’яснень від автора, залиште коментар під його публікацією.
PlasmaHH

@PlasmaHH: Насправді це вірна відповідь, лише трохи менш читабельна.
Резван Флавій Панда

1
@ RăzvanPanda Ні, це не є дійсною відповіддю, оскільки вона робить дещо інше, ніж вимагали, і різниця не описана / задокументована у відповіді. Напр. якщо minValueдорівнює 0і maxValueдорівнює 5, то maxValue > minValue ? minValue : maxValueповернеться 0, тоді як maxValue > minValue && minValue || maxValueповернеться 5.
pepkin88

@ pepkin88: Це правильно, ця відповідь не працює, коли передається хибне значення для minValue, і умова відповідає дійсності.
Резван Флавій Панда
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.