2015-05-27 5 views
2

предисловие

Это, вероятно, не имеет реального осуществления, но после прочтения another post on coffeescript's 2 switch usages, я решил поиграть с ним и нашел это довольно странный вопрос.Теоретическое CoffeeScript переключатель Заявление Conundrum

CoffeeScript

type = 'guidance' 

s = switch 
    when type is 'guidance' 
    'g' 
    when type is 'vulnerability' 
    'v' 
    else 
    'foo' 

console.log s #g 

transpiled Javascript

var s, type; 

type = 'guidance'; 

s = (function() { 
    switch (false) { 
    case type !== 'guidance': 
    return 'g'; 
    case type !== 'vulnerability': 
    return 'v'; 
    default: 
    return 'foo'; 
} 
})(); 

console.log(s); //g 

загадка

То, что я не получаю, что выражения случай компилируются на противоположное значение. Coffeescript when type is 'guidance'должен перевести на следующий javascript case type === 'guidance' справа?

Если вы используете s = switch true, тогда выражения case отображаются правильно case type === 'guidance'. Независимо от выраженных выражений case javaScript результат будет таким же.

+0

Пожалуйста, перечитайте свой вопрос. Код преобразуется в точную вещь, о которой вы говорите, она должна переместиться. – Pointy

+0

Это опечатка от копирования и вставки. Он был исправлен – jusopi

+0

Я бы не сказал, что это «головоломка». Выполненный результат завершается, и именно так coffeescript решил реализовать его. – naomik

ответ

3

Я бы не назвал этот вопрос, потому что он работает, как ожидалось :-)

По причине, я могу только догадываться (может быть, есть некоторые комментарии в компиляторе). Скорее всего, им нужно было вывести все эти выражения в логические значения - они хотят, чтобы он работал как оператор if, но switch использует оператор === для сравнения с заданным значением. Поэтому вы не можете делать

switch (true) { 
    case 1: … 
    case []: … 
    case "true": … 
} 

потому что никто из них не работал, хотя все они являются правдивыми значениями. Таким образом, вы можете использовать double not operator:

switch (true) { 
    case !!(1): … 
    case !!([]): … 
    case !!("true"): … 
} 

и любой из этих выражений будет соответствовать true. Тем не менее, вы можете уменьшить размер кода немного, перемещая внешний ! на другой стороне Comparision (!true), и получить эквивалент

switch (false) { 
    case !(1): … 
    case !([]): … 
    case !("true"): … 
} 

Вы можете увидеть именно этот шаблон в coffeescript docs. Теперь, по-видимому, компилятор достаточно умен, чтобы составить ! по значению == или === до != или !==, но это не работает для произвольных выражений.

Если вы спросите меня, они просто должны были скомпилировать это с помощью серии if else.

1

По какой-либо причине транспилятор Coffeescript генерирует оператор switch для соответствия явному значению false, а не true. Таким образом, выражения case противоположны выражениям when. Когда выражение в предложении when равно true, сгенерированный оператор switch выберет это case, потому что он ищет , противоположный условием false.

+0

Я не могу понять, почему это работает. – Pointy

+0

Это то, что я ищу, это * why * ... опять же, это все просто * говорящий магазин *, поэтому это не очень полезный код, кроме возможности выполнять разные * контекстуальные * возвращаемые значения из выражений. – jusopi

+3

@jusopi, если вы ищете * почему *, возможно, посетите '# coffeescript' на http://freenode.net и спросите там. – naomik