2012-06-26 14 views
5

में स्विच केस स्टेटमेंट के अंदर रेंज मैं अपने रेल 3.2 jquery मोबाइल एप्लिकेशन में हैंडलबार का उपयोग कर रहा हूं।कॉफ़ीस्क्रिप्ट

मैं की तरह

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 

मैं किसी भी परिणाम नहीं मिल रहा है एक Coffeescript विधि के अंदर एक स्विच मामले बयान लिखने की कोशिश कर रहा हूँ। कब रेंज का उपयोग करें। कृपया

+2

यह क्यों काम करेगा? यह [github मुद्दा] (https://github.com/jashkenas/coffee-script/issues/1383) ऐसा लगता है कि यह वाक्यविन्यास स्वीकार नहीं किया गया था। –

उत्तर

16

आपकी switch टिप्पणियों में Cygal नोट्स के रूप में काम नहीं करेगा (यानी issue 1383 देखें)। एक switch सिर्फ एक महिमा if(a == b) निर्माण है और आपको इन बातों कहने के लिए सक्षम होना चाहिए:

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

और यह काम किया है जब आप switch एक सरणी पर। कॉफीस्क्रिप्ट डिजाइनरों ने एरे को संभालने के लिए एक (नाजुक) विशेष मामला जोड़ने का विचार किया (जो सभी [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 => n और NaN <= n के बाद से अंतिम "100 से कम या बराबर 100" शाखा के नीचे नहीं आ जाएगा, जो सभी n दोनों के लिए झूठे हैं।

हां, आप बिल्कुल निश्चित हैं कि स्थिति हमेशा अनुमानित सीमा के भीतर आ जाएगी। दूसरी तरफ, असंभव होता है हर समय सॉफ्टवेयर (इसलिए comp.risks मेलिंग सूची) और छेद छोड़ने के लिए कोई अच्छा कारण नहीं है जो इतनी आसानी से भरे हुए हैं।

parseInt कॉल पर रेडिक्स तर्क के अतिरिक्त ध्यान दें, आप चीजों की गड़बड़ी करने के लिए अग्रणी शून्य नहीं चाहते हैं। हां, रेडिक्स तर्क वैकल्पिक है लेकिन यह वास्तव में नहीं होना चाहिए और आपकी उंगलियों को आपके द्वारा बनाए गए प्रत्येक parseInt कॉल में स्वचालित रूप से , 10 जोड़ना चाहिए।

+1

इस तरह का एक अच्छा जवाब: डी। मुझे दूसरे समाधान की संक्षिप्तता पसंद है, लेकिन पहले की "सर्व-अभिव्यक्ति" जैसी भी है। क्या मैं दोनों में शामिल होने का प्रस्ताव कर सकता हूं ['स्विटिच ' अभिव्यक्ति] (http://goo.gl/QKKAq) का उपयोग करके? = डी (मैं किसी नए अंक के रूप में पोस्ट करने वाले किसी भी अंक को चोरी नहीं करना चाहता) – epidemian

+0

@epidemian: यह मेरे लिए एक अच्छा विकल्प जैसा दिखता है, मेरे पास कई अंक हैं और मुझे साझा करने में कोई फर्क नहीं पड़ता है, इसलिए आपको इसे नीचे रखना चाहिए एक जवाब। मैं शायद दूसरे का उपयोग करता हूं, मुझे "यह एक रेखांकित लुकअप टेबल" प्रभाव पसंद है। –

+0

ठीक है, मैंने आपके जवाब को एक परिशिष्ट के रूप में जोड़ा है। – epidemian

8

mu is too short's answer लिए एक छोटा सा जोड़ा जा रहा है, तो आप एक 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) कर (हालांकि सीएस संकलक एक switch (false) statement with the negated conditions को उत्पन्न होगा के बराबर है अभिव्यक्तियों से बूलियन परिणाम सुनिश्चित करें ... मुझे लगता है)।


और कारण है कि पर्वतमाला काम नहीं करता है से अधिक switch पर्वतमाला कि सीएस में शाब्दिक सादे पुराने जे एस सरणियों प्रतिनिधित्व करते हैं (हालांकि संकलक जब for i in [1..something] की तरह कुछ कर रही कुछ अनुकूलन चाल करना होगा), इसलिए जब वे कर रहे हैं है एक 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 मूल्य === का उपयोग कर, की तुलना में है (और यदि यह सरणी के लिए भी काम करता है, तो यह सरणी समानता का परीक्षण करेगा, न कि switch एड मान case एड सरणी में निहित है)।

+1

देखें, यह करने लायक था। मैंने 'स्विच' के उस रूप के बारे में सोचा नहीं होगा लेकिन अगली बार मैं करूंगा। मुझे लगता है कि आप सही हैं लेकिन बूलियन संदर्भ और 'स्विच (सत्य)' के बजाय 'स्विच (झूठी)' का उपयोग कर रहे हैं। –

संबंधित मुद्दे