5

Rails3.2jqueryモバイルアプリケーションでハンドルバーを使用しています。

私はCoffeescriptメソッド内にswitchcaseステートメントを書き込もうとしています。

Handlebars.registerHelper 'status', (blog) ->
  switch(parseInt(blog.status))
    when [0..20]
      status = "active"
    when [20..40]
      status = "Moderately Active"
    when [40..60]
      status = "Very Active"
    when [60..100]
      status = "Hyper Active"
  return status

結果が得られません。で範囲を使用する方法。提案してください

4

2 に答える 2

16

コメントのCygalノートとしては機能switchしません(つまり、問題1383を参照してください)。Aは単なる栄光の構成であり、次のようなことを言うことができる必要があります。switchif(a == b)

a = [1,2,3]
switch a
...

switchアレイ上で動作するようにします。CoffeeScriptの設計者は、配列を処理するための(壊れやすい)特別なケースを追加すること[a..b]は特別に価値がないと考えました。

ifあなたは:でそれを行うことができます

Handlebars.registerHelper 'status', (blog) ->
  status = parseInt(blog.status, 10)
  if 0 <= status <= 20
    'Active'
  else if 20 < status <= 40
    'Moderately Active'
  else if 40 < status <= 60
    'Very Active'
  else if 60 < status <= 100
    'Hyper Active'
  else
    # You need to figure out what to say here

またはこのような短絡でreturn

Handlebars.registerHelper 'status', (blog) ->
  status = parseInt(blog.status, 10)
  return 'Something...'      if status <=   0
  return 'Active'            if status <=  20
  return 'Moderately Active' if status <=  40
  return 'Very Active'       if status <=  60
  return 'Hyper Active'      if status <= 100
  return 'Something else'    # This return isn't necessary but I like the symmetry

次の文字列を追加する必要がある3つの特殊なケースがあることに注意してください。

  1. status < 0
  2. status > 100
  3. statusですNaN。このケースは通常、最後の「100以下ではない」ブランチに該当しNaN => nます。これNaN <= nは、すべてに対してfalseであるためnです。

はい、あなたはステータスが常に想定された範囲内にあることを絶対に確信しています。一方、不可能なことは常にソフトウェア(したがって、comp.risksメーリングリスト)で発生し、簡単に埋められる穴を残す理由はありません。

また、parseInt呼び出しに基数引数が追加されていることに注意してください。先行ゼロで混乱を招くことは望ましくありません。はい、基数引数はオプションですが、実際にはそうではなく、指で, 10すべてのparseInt呼び出しに自動的にを追加する必要があります。

于 2012-06-26T07:47:08.257 に答える
8

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配列に含まれて===いない場合は、配列の同等性をテストします) 。switchcase

于 2012-06-26T09:37:19.240 に答える