muに少し追加するのは短すぎる答えです。2番目のコードスニペットを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'
これは基本的switch (true)
にJavaScriptで行うのと同じです(ただし、CSコンパイラは、式からブール結果が得られるようswitch (false)
に、否定された条件でステートメントを生成します...と思います)。
switch
そして、オーバーレンジが機能しない理由は、CSのレンジリテラルがプレーンな古いJS配列を表すためです(ただし、コンパイラはのようなfor i in [1..something]
ことを行うときにいくつかの最適化トリックを実行します)。配列値:switch
// 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値がed配列に含まれて===
いない場合は、配列の同等性をテストします) 。switch
case