सवाल रुबी में स्विच स्टेटमेंट कैसे लिखें?


मैं रुबी में एक स्विच स्टेटमेंट कैसे लिखूं?


1833
2018-06-04 01:18


मूल




जवाब:


रूबी का उपयोग करता है case अभिव्यक्ति बजाय।

case x
when 1..5
  "It's between 1 and 5"
when 6
  "It's 6"
when "foo", "bar"
  "It's either foo or bar"
when String
  "You passed a string"
else
  "You gave me #{x} -- I have no idea what to do with that."
end

रूबी ऑब्जेक्ट की तुलना करता है when वस्तु में खंड के साथ खंड case का उपयोग कर खंड === ऑपरेटर। उदाहरण के लिए, 1..5 === x, और नहीं x === 1..5

यह परिष्कृत के लिए अनुमति देता है when उपरोक्त के रूप में खंड। रेंज, कक्षाएं और सभी प्रकार की चीजों का परीक्षण समानता के बजाय किया जा सकता है।

भिन्न switch रूबी के कई अन्य भाषाओं में बयान case नहीं है असफल, इसलिए प्रत्येक को समाप्त करने की कोई आवश्यकता नहीं है when के साथ break। आप एकल में कई मैचों को भी निर्दिष्ट कर सकते हैं when जैसे खंड when "foo", "bar"


2306
2018-06-04 01:22



railsless.blogspot.com/2011/01/... - Pankaj
आप उत्तीर्ण तर्क पर रेगेक्स भी कर सकते हैं: जब / thisisregex / अगली पंक्ति  रखता है "यह पाया गया मैच एनआर 1 # {$ 1}" अंत है - Automatico
ध्यान देने योग्य भी है, आप अपना कोड डालकर छोटा कर सकते हैं when तथा return एक ही पंक्ति पर बयान: when "foo" then "bar" - Alexander


case...when कक्षाओं को संभालने के दौरान थोड़ा अप्रत्याशित व्यवहार करता है। यह इस तथ्य के कारण है कि यह इसका उपयोग करता है === ऑपरेटर।

वह ऑपरेटर सचमुच उम्मीदवारों के साथ काम करता है, लेकिन कक्षाओं के साथ नहीं:

1 === 1           # => true
Fixnum === Fixnum # => false

इसका मतलब है कि यदि आप एक करना चाहते हैं case ... when किसी ऑब्जेक्ट की कक्षा में, यह काम नहीं करेगा:

obj = 'hello'
case obj.class
when String
  print('It is a string')
when Fixnum
  print('It is a number')
else
  print('It is not a string')
end

प्रिंट करेगा "यह एक स्ट्रिंग नहीं है"।

सौभाग्य से, यह आसानी से सुलझाया जाता है। === ऑपरेटर को परिभाषित किया गया है ताकि यह लौट सके true यदि आप इसे कक्षा के साथ उपयोग करते हैं और उस कक्षा के उदाहरण को दूसरे ऑपरेंड के रूप में आपूर्ति करते हैं:

Fixnum === 1 # => true

संक्षेप में, उपरोक्त कोड को हटाकर तय किया जा सकता है .class:

obj = 'hello'
case obj  # was case obj.class
when String
  print('It is a string')
when Fixnum
  print('It is a number')
else
  print('It is not a string')
end

मैंने जवाब की तलाश करते समय आज इस समस्या को मारा, और यह पहला दिखाई देने वाला पृष्ठ था, इसलिए मुझे लगा कि यह मेरी स्थिति में दूसरों के लिए उपयोगी होगा।


397
2018-04-17 15:20



obj = 'हैलो'; मामला obj; जब 'हैलो' तब "यह हैलो" अंत डालता है - v Sugumar


यह किया जाता है मामला रूबी में और देखें विकिपीडिया पर यह लेख

उद्धरित:

case n
when 0
  puts 'You typed zero'
when 1, 9
  puts 'n is a perfect square'
when 2
  puts 'n is a prime number'
  puts 'n is an even number'
when 3, 5, 7
  puts 'n is a prime number'
when 4, 6, 8
  puts 'n is an even number'
else
  puts 'Only single-digit numbers are allowed'
end

एक और उदाहरण:

score = 70

result = case score
   when 0..40 then "Fail"
   when 41..60 then "Pass"
   when 61..70 then "Pass with Merit"
   when 71..100 then "Pass with Distinction"
   else "Invalid Score"
end

puts result

लगभग 123 पर (मैं जलाने का उपयोग कर रहा हूँ) रूबी प्रोग्रामिंग लैनगेज (पहला संस्करण, O'Reilly), यह कहते हैं then निम्नलिखित के बाद कीवर्ड when खंडों को एक नई लाइन या सेमीकॉलन के साथ प्रतिस्थापित किया जा सकता है (जैसा कि में है if then else वाक्य - विन्यास)। (रूबी 1.8 भी एक कोलन की जगह में अनुमति देता है then... लेकिन रूबी 1.9 में इस वाक्यविन्यास की अनुमति नहीं है।)


187
2018-06-04 01:20



when (-1.0/0.0)..-1 then "Epic fail" - Andrew Grimm
यह वह जवाब है जिसका मैंने उपयोग किया था, क्योंकि मैं केस स्विच के परिणामों के आधार पर एक चर परिभाषित कर रहा हूं। कहने के बजाय type = #{score} प्रत्येक पंक्ति, मैं बस आपके द्वारा की गई प्रतिलिपि बना सकता हूं। अधिक सुरुचिपूर्ण मैं एक लाइनर को भी बेहतर पसंद करता हूं (यदि संभव हो) - onebree


    मामले ... जब

अधिक उदाहरण जोड़ने के लिए चक का जवाब:

पैरामीटर के साथ:

case a
when 1
  puts "Single value"
when 2, 3
  puts "One of comma-separated values"
when 4..6
  puts "One of 4, 5, 6"
when 7...9
  puts "One of 7, 8, but not 9"
else
  puts "Any other thing"
end

पैरामीटर के बिना:

case
when b < 3
  puts "Little than 3"
when b == 3
  puts "Equal to 3"
when (1..10) === b
  puts "Something in closed range of [1..10]"
end

कृपया, इसके बारे में पता होना चाहिए समस्या किकिटो चेतावनी देता है।


88
2017-07-05 13:19



धन्यवाद, यह एक लाइन पर कई विकल्प रखने के लिए सहायक था। मैं उपयोग करने की कोशिश कर रहा था or - sixty4bit


कई प्रोग्रामिंग भाषाओं, विशेष रूप से सी से व्युत्पन्न, तथाकथित के लिए समर्थन है गिरावट स्विच करें। मैं रूबी में ऐसा करने का सबसे अच्छा तरीका खोज रहा था और सोचा कि यह दूसरों के लिए उपयोगी हो सकता है:

सी-जैसी भाषाओं में गिरावट आमतौर पर इस तरह दिखती है:

switch (expression) {
    case 'a':
    case 'b':
    case 'c':
        // Do something for a, b or c
        break;
    case 'd':
    case 'e':
        // Do something else for d or e
        break;
}

रूबी में, इसे निम्न तरीके से हासिल किया जा सकता है:

case expression
when 'a', 'b', 'c'
  # Do something for a, b or c
when 'd', 'e'
  # Do something else for d or e
end

यह सख्ती से समकक्ष नहीं है, क्योंकि इसे देना संभव नहीं है 'a' से पहले गिरने से पहले कोड के एक ब्लॉक निष्पादित करें 'b' या 'c', लेकिन अधिकांश भाग के लिए मुझे इसे उसी तरह उपयोगी होने के लिए पर्याप्त लगता है।


64
2017-12-07 12:11





रूबी 2.0 में, आप लैम्बडास का भी उपयोग कर सकते हैं case बयान, निम्नानुसार है:

is_even = ->(x) { x % 2 == 0 }

case number
when 0 then puts 'zero'
when is_even then puts 'even'
else puts 'odd'
end

आप कस्टम के साथ एक स्ट्रक्चर का उपयोग करके आसानी से अपने स्वयं के तुलनित्र भी बना सकते हैं ===

Moddable = Struct.new(:n) do
  def ===(numeric)
    numeric % n == 0
  end
end

mod4 = Moddable.new(4)
mod3 = Moddable.new(3)

case number
when mod4 then puts 'multiple of 4'
when mod3 then puts 'multiple of 3'
end

(उदाहरण "रूबी 2.0 में केस स्टेटमेंट के साथ प्रोसेस का इस्तेमाल किया जा सकता है?"।)

या, एक पूर्ण वर्ग के साथ:

class Vehicle
  def ===(another_vehicle)
    self.number_of_wheels == another_vehicle.number_of_wheels
  end
end

four_wheeler = Vehicle.new 4
two_wheeler = Vehicle.new 2

case vehicle
when two_wheeler
  puts 'two wheeler'
when four_wheeler
  puts 'four wheeler'
end

(उदाहरण "कैसे एक रूबी केस स्टेटमेंट काम करता है और आप इसके साथ क्या कर सकते हैं"।)


63
2017-08-01 00:04





आप नियमित अभिव्यक्तियों का उपयोग कर सकते हैं, जैसे स्ट्रिंग का प्रकार ढूंढना:

case foo
when /^(true|false)$/
   puts "Given string is boolean"
when /^[0-9]+$/ 
   puts "Given string is integer"
when /^[0-9\.]+$/
   puts "Given string is float"
else
   puts "Given string is probably string"
end

रूबी के case समानता ऑपरेंड का उपयोग करेंगे === इसके लिए (धन्यवाद @ जिमडेविले)। अतिरिक्त जानकारी "रूबी ऑपरेटर"यह @mmdemirbas उदाहरण (पैरामीटर के बिना) का उपयोग करके भी किया जा सकता है, केवल इस दृष्टिकोण के लिए यह दृष्टिकोण क्लीनर है।


47
2017-10-16 12:17





यदि आप रूबी स्विच केस में OR या स्थिति का उपयोग करने के बारे में जानना चाहते हैं:

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

case car
   when 'Maruti', 'Hyundai'
      # Code here
end

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


29
2017-07-03 06:46





इसे कहते हैं case और यह काम करता है जैसे आप उम्मीद करेंगे, साथ ही बहुत अधिक मजेदार सामान सौजन्य === जो परीक्षण लागू करता है।

case 5
  when 5
    puts 'yes'
  else
    puts 'else'
end

अब कुछ मज़ा के लिए:

case 5 # every selector below would fire (if first)
  when 3..7    # OK, this is nice
  when 3,4,5,6 # also nice
  when Fixnum  # or
  when Integer # or
  when Numeric # or
  when Comparable # (?!) or
  when Object  # (duhh) or
  when Kernel  # (?!) or
  when BasicObject # (enough already)
    ...
end

और यह पता चला है कि यदि आप / अन्य चेन (यानी, यदि परीक्षण में एक सामान्य चर शामिल नहीं है) के साथ आप मनमाने ढंग से प्रतिस्थापित भी कर सकते हैं case प्रारंभिक छोड़कर case पैरामीटर और केवल अभिव्यक्ति लिखना जहां पहला मैच आप चाहते हैं।

case
  when x.nil?
    ...
  when (x.match /'^fn'/)
    ...
  when (x.include? 'substring')
    ...
  when x.gsub('o', 'z') == 'fnzrq'
    ...
  when Time.now.tuesday?
    ...
end

24
2018-02-05 20:40





जबसे switch case हमेशा एक ऑब्जेक्ट देता है, हम सीधे इसके परिणाम प्रिंट कर सकते हैं:

puts case a
     when 0
        "It's zero"
     when 1
        "It's one"
     end

18
2017-11-05 07:29





मल्टी-वैल्यू कब और नो-वैल्यू केस:

print "Enter your grade: "
grade = gets.chomp
case grade
when "A", "B"
  puts 'You pretty smart!'
when "C", "D"
  puts 'You pretty dumb!!'
else
  puts "You can't even use a computer!"
end

और ए नियमित अभिव्यक्ति यहां समाधान:

print "Enter a string: "
some_string = gets.chomp
case
when some_string.match(/\d/)
  puts 'String has numbers'
when some_string.match(/[a-zA-Z]/)
  puts 'String has letters'
else
  puts 'String has no numbers or letters'
end

18
2018-01-20 11:45



क्यों नहीं case some_string, when /\d/, (stuff), when /[a-zA-Z]/, (stuff), end (कहा पे , मतलब न्यूलाइन) - Doorknob
ओह, और पहला भाग पहले से ही कवर किया गया है यह जवाब, और कई उत्तरों पहले से ही regex का जिक्र है। वाकई, यह जवाब कुछ भी नया नहीं जोड़ता है, और मैं इसे हटाने के लिए डाउनवॉटिंग और वोटिंग कर रहा हूं। - Doorknob
@Dorknobofnow यह दिखाने के लिए है कि आप स्विच केस में रेगेक्स समाधान और अल्पविराम अलग मूल्यों का उपयोग कर सकते हैं। निश्चित नहीं है कि समाधान आपको इतना दर्द क्यों दे रहा है। - 123
इसलिए यदि उन्हें "एफ", एक कानूनी ग्रेड मिला, तो उनकी गलती आपके कोड में एक मामला गायब है? - Mike Graf
मुझे इसका विनोद पसंद है, और तथ्य यह है कि यह दर्शाता है कि आप किसी मामले में तारों से मेल खा सकते हैं। - emery