, 당신은 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'
이는 CS 컴파일러는 switch (false)
statement with the negated conditions에 생성됩니다 불구하고 (자바 스크립트에 switch (true)
을하고 기본적으로 동일하다 부울 결과를 식에서 확인하십시오 ... 저는 생각합니다).
그리고 작동하지 않는 범위에 걸쳐 switch
는 그들이 그렇게 할 때, (for i in [1..something]
같은 것을 할 때 컴파일러가 일부 최적화 트릭을 할 것입니다하지만) CS에서 리터럴은 옛날부터 JS 배열을 나타내는 범위 즉 이유 그들은 처리됩니다 switch
안에서 발견 단지 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";
}
switch
문 내부의 값은 기본적으로 만 배열 아니, 프리미티브 작동 ===
를 사용하여 각 case
값과 비교된다 (그리고 비록 그것이 배열을 위해 작동했다 할지라도, ed 값이 case
배열에 포함되어 있지 않아도 배열 평등을 테스트 할 것입니다.
왜 작동합니까? 이 [github issue] (https://github.com/jashkenas/coffee-script/issues/1383)는이 구문이 받아 들여지지 않았다고합니다. –