प्रत्येक 'जब' ब्लॉक में कई मानों के साथ केस स्टेटमेंट


314

सबसे अच्छा तरीका है कि मैं जो कुछ भी देख रहा हूं उसका वर्णन कर सकता हूं कि मैंने आपको असफल कोड दिखाने की कोशिश की है जो मैंने अब तक कोशिश की है:

case car
  when ['honda', 'acura'].include?(car)
    # code
  when 'toyota' || 'lexus'
    # code
end

मुझे लगभग 4 या 5 अलग-अलग whenपरिस्थितियां मिली हैं, जिनके लगभग 50 अलग-अलग संभावित मूल्यों द्वारा ट्रिगर किया जाना चाहिए car। वहाँ caseब्लॉकों के साथ ऐसा करने का एक तरीका है या मुझे एक बड़े ifब्लॉक की कोशिश करनी चाहिए ?

जवाबों:


669

एक में caseबयान, एक ,के बराबर है ||एक में ifबयान।

case car
   when 'toyota', 'lexus'
      # code
end

कुछ अन्य चीजें जो आप रूबी केस स्टेटमेंट के साथ कर सकते हैं


1
इस लिंक में रूबी में केस स्टेटमेंट का बेहतर सारांश है (और इसमें रेगेक्सपी और स्पैट सिंटैक्स के उदाहरण भी शामिल हैं)।
18

मुझे पता नहीं क्यों, लेकिन यह अजीब स्थिति होती है: जब मैं इसे लिखता हूं: when "toyota", "lexus"मुझे मिलता है unexpected tSTRING_BEG, expecting keyword_do or '{' or '(' (SyntaxError):। हालांकि, जब मैं यह लिखता हूं: when "toyota","lexus"यह काम करता है। अल्पविराम के बाद एकमात्र अंतर एक स्थान है।
फुरकान अहान

@FurkanAyhan यह अजीब है। मैंने आगे बढ़कर कोड का परीक्षण केवल यह सुनिश्चित करने के लिए किया और यह काम करता है। मेरा अनुमान है कि आपके कोड में कुछ और चल रहा है जो इसे इस तरह त्रुटि बना रहा है। क्या यह संभव है कि आप कहीं स्ट्रिंग को बंद करना भूल गए या ऐसा कुछ?
चार्ल्स कैलडवेल

1
ठीक है, यह काम करता है, लेकिन प्रोग्रामर की सहजता पर माणिक फोकस के रूप में, मुझे आश्चर्य है कि यह मानक समर्थन क्यों करता है || या या'? यह भ्रामक है
ज़िया उल रहमान मुग़ल

2
रूबी समर्थन orया ||यहाँ नहीं करती है क्योंकि whenअल्पविराम द्वारा अलग-अलग अभिव्यक्तियों की श्रृंखला इसके दाईं ओर ले जाती है, एक पहचानकर्ता नहीं। इस वजह से, यदि आपके पास था when a or b, तो यह स्पष्ट नहीं है कि यह समान के रूप में लिया जाना है when a, bया नहीं when (a or b), जिनमें से उत्तरार्द्ध अभिव्यक्ति का मूल्यांकन करता a or bहै जब इसे फेंकने से पहले। भाषा को संदर्भ के आधार पर व्यवहार में परिवर्तन करने वाले टोकन के लिए संभालना अधिक आश्चर्यजनक और कम आसान है, और फिर आप थोड़ी देर orके दाईं ओर एक वास्तविक अभिव्यक्ति का उपयोग करने में सक्षम नहीं होंगे ।
तैवे

99

आप रूबी के "स्पैट" या चपटे सिंटैक्स का लाभ उठा सकते हैं।

यह ओवरग्रो whenक्लॉज़ बनाता है - आपके पास प्रति शाखा का परीक्षण करने के लिए लगभग 10 मान हैं यदि मैं सही ढंग से समझता हूं - मेरी राय में थोड़ा अधिक पठनीय। इसके अतिरिक्त, आप रनटाइम पर परीक्षण करने के लिए मानों को संशोधित कर सकते हैं। उदाहरण के लिए:

honda  = ['honda', 'acura', 'civic', 'element', 'fit', ...]
toyota = ['toyota', 'lexus', 'tercel', 'rx', 'yaris', ...]
...

if include_concept_cars
  honda += ['ev-ster', 'concept c', 'concept s', ...]
  ...
end

case car
when *toyota
  # Do something for Toyota cars
when *honda
  # Do something for Honda cars
...
end

एक अन्य सामान्य दृष्टिकोण हैश का उपयोग प्रेषण तालिका के रूप में करना होगा, जिसमें प्रत्येक मूल्य के carमानों और मानों के साथ कुछ कॉल करने योग्य वस्तु होती है जो कोड को निष्पादित करना चाहते हैं।


यह वही है जिसका मैंने उपयोग किया है, हालांकि मुझे किसी के चेक मार्क
Nick

लंबी whenलाइनों के लिए शानदार समाधान । साझा करने के लिए धन्यवाद।
पिस्टोस

0

अपने तर्क को डेटा में रखने का एक और अच्छा तरीका कुछ इस तरह है:

# Initialization.
CAR_TYPES = {
  foo_type: ['honda', 'acura', 'mercedes'],
  bar_type: ['toyota', 'lexus']
  # More...
}
@type_for_name = {}
CAR_TYPES.each { |type, names| names.each { |name| @type_for_name[type] = name } }

case @type_for_name[car]
when :foo_type
  # do foo things
when :bar_type
  # do bar things
end

मैं असभ्य होने का मतलब नहीं है, लेकिन मैं इस वजह से कम समय और स्थान पर कम कुशल हूं। यह अन्य दो उत्तरों की तुलना में अधिक जटिल और कम पठनीय है। इस विधि का उपयोग करने से क्या लाभ होगा?
निक

यह आपके पूरे वर्गीकरण को एक वस्तु में बदल देता है। अब आप उस ऑब्जेक्ट के साथ चीजें कर सकते हैं, जैसे कि इसे क्रमबद्ध करें और किसी और को अपना तर्क समझाने के लिए भेजें, या इसे डेटाबेस में संग्रहीत करें और लोगों को इसे संपादित करने की अनुमति दें। (नए कार मॉडल के सामने आने पर तर्क बहुत जल्द बदल जाएगा;) आप "टेबल-संचालित" दिख सकते हैं।
ह्यू वोल्फ

YAGNI ("आपको इसकी आवश्यकता नहीं है") यहां लागू हो सकते हैं। डिज़ाइन भविष्य में मौजूद हो सकने वाले परिदृश्य के लिए समय / स्थान दक्षता और पठनीयता का त्याग करता है, लेकिन अभी तक अस्तित्व में नहीं है। अब लागत का भुगतान किया जाता है, लेकिन इनाम कभी वापस नहीं लिया जा सकता है।
निक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.