在
mu is too short's answer的基础上,您可以将其第二个代码片段转换为
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'
这基本上相当于在JavaScript中执行
switch(true)
(尽管CS编译器将生成一个
switch(false)
语句,用于对表达式的布尔结果进行否定条件以确保布尔结果...我想是这样的)。
而 switch 中使用范围并不起作用的原因是,CS 中的范围字面量表示普通的 JS 数组(尽管编译器在处理类似于
for i in [1..something]
的代码时会进行一些优化技巧),因此当它们出现在 switch 中时,它们被视为普通的数组值:
如同正常的数组值。
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";
}
在
switch
语句中,其内部的值会与每个
case
值进行比较,使用的是
===
,这只适用于基本类型,而不适用于数组(即使它适用于数组,也只是测试数组是否相等,而不是测试
switch
的值是否包含在
case
数组中)。