L'aggiunta di un po 'piccolo per mu is too short's answer, è possibile trasformare il suo secondo frammento di codice in un'espressione switch
:
Handlebars.registerHelper 'status', (blog) ->
status = parseInt(blog.status, 10)
switch
when status <= 0 then 'Something...'
when status <= 20 then 'Active'
when status <= 40 then 'Moderately Active'
when status <= 60 then 'Very Active'
when status <= 100 then 'Hyper Active'
else 'Something else'
questo è fondamentalmente equivale a fare un switch (true)
in JavaScript (anche se il compilatore CS genererà un switch (false)
statement with the negated conditions a garantire risultati booleani dalle espressioni ... penso).
E la ragione per cui il switch
over range non funziona è che spazia letterali in CS rappresentano i vecchi sistemi JS semplici (anche se il compilatore fare alcuni trucchi di ottimizzazione quando si fa qualcosa di simile for i in [1..something]
), in modo da quando sono trovato all'interno di un switch
vengono trattati solo like normal array values:
// Generated JS for question's CS code:
switch (parseInt(blog.status)) {
case [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]:
status = "active";
break;
case [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40]:
status = "Moderately Active";
break;
case [40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60]:
status = "Very Active";
break;
case (function() {
_results = [];
for (_i = 60; _i <= 100; _i++){ _results.push(_i); }
return _results;
}).apply(this):
status = "Hyper Active";
}
il valore all'interno dell'istruzione switch
è fondamentalmente confrontato con ciascun valore case
utilizzando ===
, che funziona solo per primitive, non per array (e anche se ha funzionato per gli array, testerebbe l'uguaglianza dell'array, non se il valore di switch
è contenuto negli array di case
ed).
Perché questo dovrebbe funzionare? Questo [problema github] (https://github.com/jashkenas/coffee-script/issues/1383) sembra dire che questa sintassi non è stata accettata. –