、あなたがswitch
式にその2番目のコードスニペットを変換することができます。
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に生成されますが、これは(基本的にJavaScriptで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
ed配列に含まれている場合ではなく、配列の等価性をテストすることになります)。
これはなぜ機能しますか?この[github issue](https://github.com/jashkenas/coffee-script/issues/1383)は、この構文が受け入れられなかったと言われています。 –