2012-06-26 2 views
5

Rails 3.2 jquery 모바일 응용 프로그램에서 핸들을 사용하고 있습니다. Coffeescript의 스위치 케이스 내부 구문

나는

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 

내가 어떤 결과를 얻고 있지 않다처럼 커피 스크립트 방법 내부 스위치 케이스 문을 작성하려합니다. 범위를 사용하는 방법.

+2

왜 작동합니까? 이 [github issue] (https://github.com/jashkenas/coffee-script/issues/1383)는이 구문이 받아 들여지지 않았다고합니다. –

답변

16

당신의 switch이 코멘트에 Cygal 노트 (즉 issue 1383 참조)로 작동하지 않습니다 제안 해주십시오. switch 그냥 영광 if(a == b) 구조이고 당신은 같은 것을 말할 수 있어야합니다 :

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

및 작동 한 때 배열에 switch. CoffeeScript 설계자는 배열 (모든 [a..b])을 처리하기 위해 (깨지기 쉬운) 특별한 경우를 추가하는 것이 특별히 가치가 없다고 생각했습니다.

당신은 if 함께 할 수 있습니다 : 당신이 당신이 문자열을 추가 할 필요가 세 가지 특별한 경우가

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 

참고 :

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의이 같은 단락으로 :

  1. status < 0.
  2. status > 100.
  3. statusNaN입니다. 이 경우는 일반적으로 NaN => nNaN <= n이 모두 n에 대해 거짓이므로 최종 "100보다 작거나 같지 않음"분기에 해당합니다.

예. 상태가 항상 상정 된 범위 내에 있음을 확신합니다. 반면에 불가능한 것은 항상 소프트웨어 (comp.risks 메일 링리스트)가 항상 발생하기 때문에 너무 쉽게 채워지는 구멍을 남겨 둘 이유가 없습니다.

parseInt 호출에 기수 인수를 추가하면 앞에 오는 0이 사물을 엉망으로 만들지는 않을 것입니다. 예, 기수 인수는 선택 사항이지만 실제로는 안됩니다. parseInt 전화를 할 때마다 손가락이 자동으로 , 10을 추가해야합니다. mu is too short's answer에 작은 비트를 추가

+1

좋은 답변 : D. 나는 두 번째 해법의 간결함을 좋아하지만 첫 번째 해의 "표현력"을 좋아한다. 'swtich '표현식 (http://goo.gl/QKKAq)을 사용하여 [ = D (새로운 답변으로 게시 한 점수를 훔치고 싶지 않습니다.) – epidemian

+0

@epidemian : 저에게는 좋은 대안 인 것 같습니다. 많은 점수가있어서 공유하는 데 신경 쓰지 않아도됩니다. 답변. 아마 두 번째를 사용할 것입니다. "인라인 조회 테이블"효과를 좋아합니다. –

+0

좋아요, 나는 당신의 부록으로 답변을 추가했습니다. – epidemian

8

, 당신은 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 배열에 포함되어 있지 않아도 배열 평등을 테스트 할 것입니다.

+1

참조하십시오. 나는 그 형태의 '전환'을 생각하지 않았지만 다음 번에는 그렇게 할 것이다. 나는 당신이 옳다고 생각하지만 부울 문맥을 생각하고'switch (true)'대신'switch (false)'를 사용한다. –