Троичная операция в 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 Я думаю, что троичный мог бы сделать кофе менее рубиновым, даже если у Руби есть это. Целью кофе всегда является удобочитаемость и округление неровных углов.
Jcollum

37
@jcollum согласился, но что на самом деле я считаю наиболее тревожные является то , что a = true ? 5 : 10является действительным CoffeeScript, но не означает трехкомпонентную структуру, вместо (в JavaScript) , это означает: a = true ? true : {5:10}который известен как плохой thing® Кроме того , 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. Экзистенциальный оператор самый лучший.
Скали

Ответы:


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/issues/11#issuecomment-97802 ). [Мои 2 цента - хотя я осознаю произвольность ?:, я думаю, что if..then..elseэто слишком многословная замена для того, что должно быть кратким выражением. И?: В конце концов, это очень укоренившийся стандарт для многих языков, в том числе для JavaScript. Несмотря на все это, на данном этапе кажется, что это
заложено

1
Я согласен с автором CoffeeScript, я всегда думал, что троичный синтаксис уродлив и не интуитивен. Если вы можете использовать if then elseодну и ту же строку, сделайте это, это 7 дополнительных символов для большей ясности и элегантности.
Джошуа Пинтер

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

Весь привод к удалению очень стандартных кросс-языковых структур просто сводит людей с ума, особенно если вы добавляете другие «полезные» вещи, такие как pug ... Если вы не можете вывести все последовательности аргументов и призрачные скобки ...
Grunion Shaftoe


21

Почти на любом языке это должно работать вместо:

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

38
Это работает, но гораздо менее понятно, и нет причин делать это на любом языке, который имеет лучший синтаксис для этого.
Ибрагим

10
Это не эквивалентно во многих языках, где есть неявное преобразование в falseзначения, такие как 0, ноль, неопределенное и т. Д.
Lord of the Goo

12
@Ibrahim Это работает как условная троица только в том случае, если часть после &&метки верна, в противном случае она вернет последнюю часть, что не так, как работают условные троицы.
pepkin88

Именно разница! :)
Пьер Войзен

из всех примеров, это тот, который я нашел бы наиболее хитрым, чтобы рассказать, какие переменные есть в любом конкретном языке, с которым я могу столкнуться - особенно в языке, таком как CoffeeScript (или Ruby), где пробелы не всегда пробелы
Тони Ли

12

Coffeescript не поддерживает троичный оператор javascript. Вот причина от автора coffeescript :

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

Их синтаксис - просто еще одна загадочная магия для запоминания, не имеющая аналогов ни в чем другом языке. Если результат будет одинаковым, я бы предпочел if/elsesвсегда выглядеть одинаково (и всегда быть скомпилированным в выражение).

Так, в CoffeeScript даже многострочные ifs будут компилироваться в троичные, когда это уместно, как и операторы if без предложения else:

if sunny   
  go_outside() 
else   
  read_a_book().

if sunny then go_outside() else read_a_book()

Оба становятся троичными, оба могут использоваться как выражения. Это согласуется, и нет нового синтаксиса для изучения. Итак, спасибо за предложение, но я закрываю этот тикет как "wontfix".

Пожалуйста, обратитесь к проблеме GitHub: https://github.com/jashkenas/coffeescript/issues/11#issuecomment-97802


3

Вы также можете написать это в двух утверждениях, если это в основном верно:

a = 5
a = 10 if false

Или используйте оператор switch, если вам нужно больше возможностей:

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.