Añadiendo un poquito a mu is too short's answer, puede transformar su segundo fragmento de código en una expresión 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'
Esto es básicamente lo mismo que hacer un switch (true)
en JavaScript (aunque el compilador CS generará una switch (false)
statement with the negated conditions a asegurar resultados booleanos de las expresiones ... creo).
Y la razón por la switch
sobre rangos que no funciona es que los rangos de literales en CS representan lisos viejos matrices JS (aunque el compilador hacer algunos trucos de optimización cuando se hace algo así como for i in [1..something]
), por lo que cuando están encontrado dentro de un switch
que son tratados 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";
}
el valor dentro de la instrucción switch
es, básicamente, en comparación con el uso de cada valor case
===
, que sólo funciona para las primitivas, no para las matrices (e incluso si funcionó para matrices, estaría probando la igualdad de matrices, no si el valor ed switch
está contenido en las matrices ed case
).
¿Por qué funcionaría? Este [problema de github] (https://github.com/jashkenas/coffee-script/issues/1383) parece decir que esta sintaxis no fue aceptada. –