Потрійна операція в CoffeeScript


318

Мені потрібно встановити значення, aщо залежить від умови.

Який найкоротший спосіб зробити це за допомогою CoffeeScript?

Наприклад, це я б робив у JavaScript:

a = true  ? 5 : 10  # => a = 5
a = false ? 5 : 10  # => a = 10

120
<rant> Я хотів би, щоб сценарій кави міг просто підтримувати синтаксис потрійного оператора, він коротший і легший для читання, ніж if else then </rant>
AJP

2
@AJP Я думаю, що потрійний зробить каву менше Ruby-ish, хоча Рубі це має. Мета з кавою - це завжди читабельність і округлення грубих кутів.
jcollum

37
@jcollum погодився, але те, що насправді мені найбільше непокоїть, це те, що a = true ? 5 : 10є дійсним кофеескриптом, але це не означає потрійну структуру, натомість (у javascript) це означає: a = true ? true : {5:10}що відоме як погана річ® Додатково a = false ? {5 : 10}в coffeescript тоді (у javascript) є рівнозначно: a = true ? false : {5:10} Щодо того, що це варто, я не думаю, що це добре.
AJP

2
Це може бути найкращим чином прописати, якщо ... тоді .. і для CoffeeScript. ? як оператор існування має багато сенсу: beast = yeti ? "bear"або if yeti? then alert "It's a yeti!"змушує використовувати його ?досить добре.
Пол Олівер

3
Окремий потрійний оператор насправді не потрібен в CoffeeScript, оскільки if/then/elseце вже вираз, і робить те саме. Якщо ви насправді цього не вистачаєте, то ви скоріше звикли до синтаксису C або JavaScript, ніж насправді цього потребуєте. Якщо воно недостатньо читабельне, а іноді це трапляється, просто загорніть цілий вираз у дужки. Оператор ?був пошкоджений для більш корисних перевірок, які відсутні в JavaScript, як уже заявляв @PaulOliver. Екзистенціальний оператор - найкращий.
skalee

Відповіді:


544

Оскільки все є виразом і, таким чином, призводить до значення, ви можете просто використовувати if/else.

a = if true then 5 else 10
a = if false then 5 else 10

Більше про приклади виразів ви можете подивитися тут .


8
Я думаю, є причина, що coffeescript не підтримує потрійний синтаксис за замовчуванням у JavaScript?
Августин Рідінгер

41
Причиною є перевага творця до чогось "менш криптованого" та менш довільного (наприклад, github.com/jashkenas/coffeescript/isissue/11#issuecomment-97802 ). [Мої 2 копійки - Поки я усвідомлюю свавілля ?:, я думаю, що if..then..elseце занадто багатослівна заміна того, що повинно бути стислим виразом. І?: Зрештою, дуже вбудований стандарт серед багатьох мов, JavaScript серед них. Незважаючи на все це, воно, здається, встановлено в камені на цьому етапі.]
mahemoff

1
Я погоджуюся з автором CoffeeScript, я завжди вважав, що потрійний синтаксис є некрасивим та неінтуїтивним автофокусом. Якщо ви можете використовувати if then elseв одній лінії, зробіть це, це 7 додаткових символів для набагато більшої чіткості та елегантності.
Джошуа Пінтер

Залежить від смаку, але я сильно віддаю перевагу символам над ключовими словами, такими як ->надмірно functionчи { }більше begin .. end, тому що мені подобається бачити високе співвідношення сигнал / шум, де слова зарезервовані для логіки, яка залежить від функції, а операційна логіка в основному відпускається до символів.
mahemoff

Весь потяг до видалення дуже стандартних міжмовних структур насправді просто накручує людей, які займаються технічним обслуговуванням, особливо коли ви додаєте інші "корисні" речі, такі як мопс ... Якщо ви не можете зробити висновки всіх послідовностей аргументів та привидних дужок ...
Grunion Shaftoe


21

Практично на будь-якій мові це має працювати замість цього:

a = true  && 5 || 10
a = false && 5 || 10

38
Це працює, але це набагато менш зрозуміло і немає підстав робити це будь-якою мовою, яка має кращий синтаксис для цього.
Ібрагім

10
Це не еквівалентно багатьом мовам, де є неявна конверсія falseтаких значень, як 0, null, undefined,… і так далі
Lord of Goo

12
@Ibrahim Це працює як умовний термінал лише у тому випадку, якщо частина після &&позначки є truthy, інакше вона поверне останню частину, яка не є тим, як працюють умовні тернарії.
pepkin88

Точно, різниця! :)
П'єр Войсін

з усіх прикладів, це саме те, що я вважаю найскладнішим, щоб розповісти про те, які змінні є на будь-якій мові, на яку я можу зіткнутися, - особливо це таке, як CoffeeScript (або Ruby), де пробіли не завжди пробіли
Тоні Лей

12

Coffeescript не підтримує термінальний оператор javascript. Ось причина автора coffeescript :

Я люблю потрійних операторів так само, як і наступний хлопець (напевно, трохи більше, насправді), але синтаксис - це не те, що робить їх хорошими - вони чудові, тому що вони можуть вмістити if / else в одному рядку як вираз.

Їх синтаксис - лише чергова містифікаційна магія запам'ятовування, що не має аналогів нічому іншому в мові. Результат рівний, я б набагато краще if/elsesзавжди виглядав однаково (і завжди був складений у вираз).

Так, у CoffeeScript навіть багаторядкові ifs збиратимуться в тернари, коли це доречно, як і якщо заяви без іншого пункту:

if sunny   
  go_outside() 
else   
  read_a_book().

if sunny then go_outside() else read_a_book()

Обидва стають тернарями, обидва можуть бути використані як вирази. Це послідовно, і немає нового синтаксису для вивчення. Тож, дякую за пропозицію, але я закриваю цей квиток як "wontfix".

Зверніться до випуску github: https://github.com/jashkenas/coffeescript/isissue/11#issuecomment-97802


3

Ви також можете написати це у двох твердженнях, якщо це здебільшого справжнє використання:

a = 5
a = 10 if false

Або використовуйте оператор перемикання, якщо вам потрібно більше можливостей:

a = switch x
  when true then 5
  when false then 10

З булевим він може бути великим, але я вважаю, що це дуже легко читається.


1

Багаторядкова версія (наприклад, якщо вам потрібно додавати коментар після кожного рядка):

a = if b # a depends on b
then 5   # b is true 
else 10  # b is false

0

CoffeeScriptне має потрійного оператора. Ось що кажуть документи.

Ви все ще можете використовувати такий синтаксис

a = true then 5 else 10

Це набагато зрозуміліше.

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