मैं switch
रूबी में एक बयान कैसे लिखूं ?
मैं switch
रूबी में एक बयान कैसे लिखूं ?
जवाबों:
रूबी इसके बजाय 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"
।
when
और return
स्टेटमेंट डालकर अपने कोड को छोटा कर सकते हैं :when "foo" then "bar"
then
। कृपया अन्य उत्तर भी देखें।
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 or number')
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 or number')
end
मैंने उत्तर की तलाश करते हुए आज इस समस्या को मारा, और यह पहला दिखने वाला पृष्ठ था, इसलिए मुझे लगा कि यह मेरी उसी स्थिति में दूसरों के लिए उपयोगी होगा।
.class
में भाग है, धन्यवाद टिप्पणी करने के लिए दिलचस्प है। बेशक, यह पूरी तरह से उचित व्यवहार है (हालांकि मैं देख सकता था कि यह सोचना एक सामान्य गलती कैसे हो सकती है कि यह प्रिंट होगा It is a string
) ... आप कुछ मनमानी वस्तु के वर्ग का परीक्षण कर रहे हैं , न कि स्वयं वस्तु। तो, उदाहरण के लिए: case 'hello'.class when String then "String!" when Class then "Class!" else "Something else" end
में परिणाम: "Class!"
इस के लिए एक ही काम करता है 1.class
, {}.class
आदि गिराने .class
पर हम पाते हैं "String!"
या "Something else"
इन विभिन्न मूल्यों के लिए।
यह case
रूबी में उपयोग किया जाता है । विकिपीडिया पर " स्विच स्टेटमेंट " भी देखें ।
उद्धरित:
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 के आसपास , यह कहता है कि then
क्लॉस के बाद वाले कीवर्ड when
को एक नई पंक्ति या अर्धविराम ( if then else
सिंटैक्स की तरह ) से बदला जा सकता है । (रूबी 1.8 के स्थान पर एक बृहदान्त्र की अनुमति देता है then
, लेकिन रूबी 1.9 में इस वाक्यविन्यास की अब अनुमति नहीं है।)
when (-1.0/0.0)..-1 then "Epic fail"
type = #{score}
प्रत्येक पंक्ति कहने के बजाय , मैं बस वही कर सकता हूं जो आपने किया था। बहुत अधिक सुरुचिपूर्ण मुझे एक-लाइनर भी बहुत अच्छा लगता है (यदि संभव हो तो)
चक के उत्तर में और उदाहरण जोड़ने के लिए :
पैरामीटर के साथ:
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
कृपया, " रूबी में एक स्विच स्टेटमेंट कैसे लिखें " के बारे में जागरूक रहें जो किकिटो के बारे में चेतावनी देता है।
or
कई प्रोग्रामिंग भाषाएं, विशेष रूप से सी से व्युत्पन्न, तथाकथित स्विच फालिथ के लिए समर्थन है । मैं रूबी में ऐसा करने का सबसे अच्छा तरीका खोज रहा था और सोचा कि यह दूसरों के लिए उपयोगी हो सकता है:
सी-लाइक भाषाओं में आम तौर पर इस तरह दिखाई देती है:
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'
, लेकिन अधिकांश भाग के लिए मैं इसे समान रूप से उपयोगी होने के लिए पर्याप्त मानता हूं।
रूबी 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
(उदाहरण " कैसे एक रूबी केस स्टेटमेंट काम करता है और आप इसके साथ क्या कर सकते हैं " से लिया गया है।)
आप नियमित अभिव्यक्ति का उपयोग कर सकते हैं, जैसे कि एक प्रकार की स्ट्रिंग खोजना:
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
समानता ऑपरेंड का उपयोग करेगी ===
(धन्यवाद @JimDeville)। अतिरिक्त जानकारी " रूबी ऑपरेटरों " पर उपलब्ध है । यह @mmdemirbas उदाहरण (पैरामीटर के बिना) का उपयोग करके भी किया जा सकता है, केवल इस तरह के मामलों के लिए यह दृष्टिकोण क्लीनर है।
यदि आप यह जानने के लिए उत्सुक हैं कि रूबी स्विच मामले में OR शर्त का उपयोग कैसे करें:
तो, एक में case
बयान, एक ,
के बराबर है ||
एक में if
बयान।
case car
when 'Maruti', 'Hyundai'
# Code here
end
" कैसे एक रूबी केस स्टेटमेंट काम करता है और आप इसके साथ क्या कर सकते हैं " देखें।
यह कहा जाता है 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
रूबी case
स्विच स्टेटमेंट लिखने के लिए उपयोग करती है ।
case
प्रलेखन के अनुसार :
केस स्टेटमेंट में एक वैकल्पिक स्थिति होती है, जो कि तर्क की स्थिति में होती है
case
, और शून्य या अधिकwhen
क्लॉस होती है।when
स्थिति का मिलान करने के लिए पहला खंड (या बूलियन सत्य का मूल्यांकन करने के लिए, यदि स्थिति शून्य है) "जीत", और इसके कोड श्लोक को निष्पादित किया जाता है। केस स्टेटमेंट का मूल्य सफलwhen
क्लॉज का मूल्य है , याnil
यदि ऐसा कोई क्लॉज नहीं है।एक केस स्टेटमेंट
else
क्लॉज के साथ समाप्त हो सकता है । प्रत्येकwhen
कथन में कई उम्मीदवार मान हो सकते हैं, जिन्हें अल्पविराम द्वारा अलग किया जाता है।
उदाहरण:
case x
when 1,2,3
puts "1, 2, or 3"
when 10
puts "10"
else
puts "Some other number"
end
छोटा संस्करण:
case x
when 1,2,3 then puts "1, 2, or 3"
when 10 then puts "10"
else puts "Some other number"
end
और " रूबी के मामले के बयान - उन्नत तकनीकों " के रूप में रूबी का वर्णन है case
;
सीमाओं के साथ इस्तेमाल किया जा सकता है :
case 5
when (1..10)
puts "case statements match inclusion in a range"
end
## => "case statements match inclusion in a range"
Regex के साथ इस्तेमाल किया जा सकता है :
case "FOOBAR"
when /BAR$/
puts "they can match regular expressions!"
end
## => "they can match regular expressions!"
Procs और Lambdas के साथ इस्तेमाल किया जा सकता है :
case 40
when -> (n) { n.to_s == "40" }
puts "lambdas!"
end
## => "lambdas"
इसके अलावा, अपने खुद के मैच वर्गों के साथ इस्तेमाल किया जा सकता है:
class Success
def self.===(item)
item.status >= 200 && item.status < 300
end
end
class Empty
def self.===(item)
item.response_size == 0
end
end
case http_response
when Empty
puts "response was empty"
when Success
puts "response was a success"
end
आपके मामले के आधार पर, आप तरीकों के हैश का उपयोग करना पसंद कर सकते हैं।
यदि when
s की एक लंबी सूची है और उनमें से प्रत्येक के पास (अंतराल नहीं) के साथ तुलना करने के लिए एक ठोस मूल्य है, तो हैश के तरीकों की घोषणा करना और फिर उसी तरह हैश से संबंधित विधि को कॉल करना अधिक प्रभावी होगा।
# Define the hash
menu = {a: :menu1, b: :menu2, c: :menu2, d: :menu3}
# Define the methods
def menu1
puts 'menu 1'
end
def menu2
puts 'menu 2'
end
def menu3
puts 'menu3'
end
# Let's say we case by selected_menu = :a
selected_menu = :a
# Then just call the relevant method from the hash
send(menu[selected_menu])
बहु-मूल्य जब और नो-वैल्यू केस:
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
case some_string, when /\d/, (stuff), when /[a-zA-Z]/, (stuff), end
(जहां ,
न्यूलाइन का मतलब है)
आप case
रूबी में दो अलग-अलग तरीकों से अभिव्यक्ति लिख सकते हैं :
if
बयानों की एक श्रृंखला के समानcase
और प्रत्येक when
क्लॉज की तुलना लक्ष्य से की गई है।age = 20
case
when age >= 21
puts "display something"
when 1 == 0
puts "omg"
else
puts "default condition"
end
या:
case params[:unknown]
when /Something/ then 'Nothing'
when /Something else/ then 'I dont know'
end
बहुत सारे उत्तर, लेकिन मैंने सोचा कि मैं एक तथ्य जोड़ूंगा .. यदि आप वस्तुओं (कक्षाओं) की तुलना करने का प्रयास कर रहे हैं, तो सुनिश्चित करें कि आपके पास एक स्पेस शिप विधि है (मजाक नहीं) या समझें कि उनकी तुलना कैसे की जा रही है।
" रूबी समानता और वस्तु तुलना " विषय पर एक अच्छी चर्चा है।
जैसा कि ऊपर दिए गए कई उत्तरों में कहा गया है, ===
ऑपरेटर का उपयोग ऑन case
/ when
स्टेटमेंट्स के तहत किया जाता है ।
यहाँ उस ऑपरेटर के बारे में अतिरिक्त जानकारी दी गई है:
===
रूबी की कई अंतर्निहित कक्षाएं, जैसे स्ट्रिंग, रेंज और रेगेक्सपी, ===
ऑपरेटर के अपने स्वयं के कार्यान्वयन प्रदान करती हैं , जिन्हें "केस-समानता", "ट्रिपल इक्वल्स" या "थ्रीक्वल्स" के रूप में भी जाना जाता है। क्योंकि यह प्रत्येक वर्ग में अलग तरह से लागू किया जाता है, इसलिए यह उस वस्तु के प्रकार के आधार पर अलग-अलग व्यवहार करेगा, जिस पर उसे बुलाया गया था। आम तौर पर, यह सही है कि अगर वस्तु "दाईं ओर" है या "बाईं तरफ की वस्तु" का सदस्य है। उदाहरण के लिए, इसका उपयोग यह जांचने के लिए किया जा सकता है कि कोई वस्तु किसी वर्ग (या उसके उप-वर्गों) में से एक है।
String === "zen" # Output: => true
Range === (1..2) # Output: => true
Array === [1,2,3] # Output: => true
Integer === 2 # Output: => true
वही परिणाम अन्य तरीकों से प्राप्त किया जा सकता है जो संभवतः नौकरी के लिए सबसे उपयुक्त हैं, जैसे कि is_a?
और instance_of?
।
===
जब ===
ऑपरेटर को रेंज ऑब्जेक्ट पर बुलाया जाता है, तो यह सही होता है यदि दाईं ओर का मूल्य बाईं ओर की सीमा के भीतर आता है।
(1..4) === 3 # Output: => true
(1..4) === 2.345 # Output: => true
(1..4) === 6 # Output: => false
("a".."d") === "c" # Output: => true
("a".."d") === "e" # Output: => false
याद रखें कि ===
ऑपरेटर ===
बाएं हाथ की वस्तु की विधि को आमंत्रित करता है । तो (1..4) === 3
के बराबर है (1..4).=== 3
। दूसरे शब्दों में, बाएं हाथ के ऑपरेंड का वर्ग परिभाषित करेगा कि ===
विधि के किस कार्यान्वयन को कहा जाएगा, इसलिए ऑपरेंड की स्थिति विनिमेय नहीं है।
===
सही पर लौटाता है यदि दाईं ओर का तार बाईं ओर नियमित अभिव्यक्ति से मेल खाता है।
/zen/ === "practice zazen today" # Output: => true
# is similar to
"practice zazen today"=~ /zen/
ऊपर दिए गए दो उदाहरणों के बीच एकमात्र प्रासंगिक अंतर यह है कि जब कोई मैच होता है, तो ===
सच होता है और =~
एक पूर्णांक देता है, जो रूबी में एक सत्य मूल्य है। हम जल्द ही इस पर वापस लौटेंगे।
puts "Recommend me a language to learn?"
input = gets.chomp.downcase.to_s
case input
when 'ruby'
puts "Learn Ruby"
when 'python'
puts "Learn Python"
when 'java'
puts "Learn Java"
when 'php'
puts "Learn PHP"
else
"Go to Sleep!"
end
$age = 5
case $age
when 0 .. 2
puts "baby"
when 3 .. 6
puts "little child"
when 7 .. 12
puts "child"
when 13 .. 18
puts "youth"
else
puts "adult"
end
अधिक जानकारी के लिए " रूबी - यदि ... और, मामला, जब तक " देखें।
मैंने उपयोग करना शुरू कर दिया है:
a = "secondcase"
var_name = case a
when "firstcase" then "foo"
when "secondcase" then "bar"
end
puts var_name
>> "bar"
यह कुछ मामलों में कॉम्पैक्ट कोड की मदद करता है।
Hash
एक case
बयान के बजाय एक का उपयोग करके किया जाना चाहिए ।
अपने वातावरण में नियमित अभिव्यक्ति के लिए कोई समर्थन नहीं? जैसे Shopify स्क्रिप्ट संपादक (अप्रैल, 2018):
[त्रुटि]: असंवैधानिक निरंतर RegExp
पहले से ही यहाँ और यहाँ कवर विधियों के संयोजन के बाद एक वर्कअराउंड :
code = '!ADD-SUPER-BONUS!'
class StrContains
def self.===(item)
item.include? 'SUPER' or item.include? 'MEGA' or\
item.include? 'MINI' or item.include? 'UBER'
end
end
case code.upcase
when '12345PROMO', 'CODE-007', StrContains
puts "Code #{code} is a discount code!"
when '!ADD-BONUS!'
puts 'This is a bonus code!'
else
puts 'Sorry, we can\'t do anything with the code you added...'
end
मैं or
वर्ग विधि कथन में s का उपयोग करता हूं क्योंकि ||
इसकी पूर्वता अधिक है
.include?
। यदि आप एक रूबी-नाज़ी हैं , तो कृपया कल्पना करें कि मैंने (item.include? 'A') || ...
इसके बजाय इसका उपयोग किया है । repl.it परीक्षण।
,
एक when
खंड में अल्पविराम ( ) पर जोर देना महत्वपूर्ण है । यह ||
एक if
कथन के रूप में कार्य करता है , अर्थात यह एक OR तुलना करता है औरwhen
खंड के सीमांकित अभिव्यक्तियों के बीच AND तुलना नहीं करता है । निम्नलिखित केस स्टेटमेंट देखें:
x = 3
case x
when 3, x < 2 then 'apple'
when 3, x > 2 then 'orange'
end
=> "apple"
x
2 से कम नहीं है, फिर भी रिटर्न वैल्यू है "apple"
। क्यों? क्योंकि x
3 था और तब से ',`` acts as an
|| , it did not bother to evaluate the expression
x <2 '।
आप सोच सकते हैं कि AND करने के लिए , आप नीचे ऐसा कुछ कर सकते हैं, लेकिन यह काम नहीं करता है:
case x
when (3 && x < 2) then 'apple'
when (3 && x > 2) then 'orange'
end
=> nil
यह क्योंकि काम नहीं करता है (3 && x > 2)
सही का आकलन, और रूबी सही मूल्य लेता है और यह तुलना x
के साथ ===
, जो सच नहीं है, के बाद से x
3 है।
एक &&
तुलना करने के लिए , आपको case
एक if
/ else
ब्लॉक की तरह व्यवहार करना होगा :
case
when x == 3 && x < 2 then 'apple'
when x == 3 && x > 2 then 'orange'
end
रूबी प्रोग्रामिंग लैंग्वेज बुक में, मैट्स का कहना है कि यह बाद वाला रूप सरल (और आमतौर पर इस्तेमाल किया जाने वाला) रूप है, जो if
/ elsif
/ के लिए एक वैकल्पिक वाक्यविन्यास से ज्यादा कुछ नहीं है else
। हालांकि, चाहे यह आमतौर पर उपयोग किया जाता है या नहीं, मुझे &&
दिए गए when
क्लॉज के लिए कई अभिव्यक्तियों को संलग्न करने का कोई अन्य तरीका नहीं दिखता है ।
if...elsif
? ऐसा लगता है कि आप एक केस स्टेटमेंट और एक शर्त को मिलाने की कोशिश कर रहे हैं। क्यों? बस जब ब्लॉक, जैसे अंदर सशर्त डाल दिया । when 3; ( x < 2 ) ? 'apple' : 'orange'
हम कई शर्तों के लिए स्विच स्टेटमेंट लिख सकते हैं।
उदाहरण के लिए,
x = 22
CASE x
WHEN 0..14 THEN puts "#{x} is less than 15"
WHEN 15 THEN puts "#{x} equals 15"
WHEN 15 THEN puts "#{x} equals 15"
WHEN 15..20 THEN puts "#{x} is greater than 15"
ELSE puts "Not in the range, value #{x} "
END
case
, when
, end
) केस-संवेदी होते हैं और इस तरह अपरकेस नहीं हो सकता।
NoMethodError (undefined method
मामला 'मुख्य: वस्तु) के लिए `। जैसा कि @ sondra.kinsey ने कहा, आप ऊपरी स्थिति का उपयोग नहीं कर सकते। रूबी सोचेंगी यह एक CONSTANT है।
case
बयान ऑपरेटर की तरह है switch
अन्य भाषाओं में।
यह switch...case
C का वाक्य रचना है:
switch (expression)
{
case constant1:
// statements
break;
case constant2:
// statements
break;
.
.
.
default:
// default statements
}
यह case...when
रूबी में वाक्य रचना है :
case expression
when constant1, constant2 #Each when statement can have multiple candidate values, separated by commas.
# statements
next # is like continue in other languages
when constant3
# statements
exit # exit is like break in other languages
.
.
.
else
# statements
end
उदाहरण के लिए:
x = 10
case x
when 1,2,3
puts "1, 2, or 3"
exit
when 10
puts "10" # it will stop here and execute that line
exit # then it'll exit
else
puts "Some other number"
end
अधिक जानकारी के लिए case
दस्तावेज़ीकरण देखें ।