एक प्रोग्राम के लिए कुछ टेस्ट कोड लिखा है, 2 मान, एक फ़ाइल और एक नंबर पास करने की कोशिश कर रहा है। नीचे बिल्कुल काम नहीं करता है, लेकिन अगर मेरे पास puts "test"
(केस के बाहर) जैसा कुछ है तो यह काम करता है।
def read_album(music_file, number)
puts number #(this does something)
case number.to_i
when(number > 1)
puts "done"
when(number < 2)
puts "something"
when(number == 3)
puts "none of this inside case is working"
end
end
def main()
a_file = File.new("albums.txt", "r")
print("Choose album id: ")
choice_of_album = gets().to_i
read_album(a_file, choice_of_album)
end
main()
2 जवाब
आपको केस स्टेटमेंट से number.to_i
को हटाना होगा।
या ऐसा कुछ करें
case number.to_i
when 1..2
puts "foo"
when 3..100
puts "bar"
else
puts "foobar"
end
end
रूबी डॉक्स . से
केस स्टेटमेंट में एक वैकल्पिक शर्त होती है, जो केस के तर्क की स्थिति में होती है, और शून्य या अधिक जब खंड होते हैं। कंडीशन से मेल खाने वाला पहला क्लॉज (या बूलियन ट्रुथ का मूल्यांकन करने के लिए, अगर कंडीशन शून्य है) "जीतता है", और इसके कोड श्लोक को निष्पादित किया जाता है। केस स्टेटमेंट का मान सफल होने का मान है जब क्लॉज, या शून्य अगर ऐसा कोई क्लॉज नहीं है।
आपका संस्करण कुछ इस तरह का मूल्यांकन करेगा
if (number > 1) === number.to_i
और चूंकि आप किसी संख्या की तुलना बूलियन व्यंजक से कर रहे हैं, यह सत्य का मूल्यांकन नहीं करेगा। यदि आपके पास केस स्टेटमेंट में कोई और होता तो इसे कॉल किया जाता।
आपके case
वह नहीं कर रहे हैं जो आप सोचते हैं। when
को दिए गए भावों का मूल्यांकन किया जाता है और परिणाम की तुलना केस समानता ऑपरेटर ===
का उपयोग करके case
मान से की जाएगी। एक व्यंजक जैसे number > 1
का मूल्यांकन या तो true
या false
होगा। इस परिणाम की तुलना रूबी में एक पूर्णांक से करने का कोई मतलब नहीं है।
आपको सीधे स्थिरांक से तुलना करनी चाहिए।
case number
when 1
# handle 1
when 2
# handle 2
when 3
# handle 3
else
# handle unknown case; error?
end
ध्यान दें कि अन्य वर्ग उपयोगी व्यवहार प्रदान करने के लिए ===
को ओवरराइड कर सकते हैं। उदाहरण के लिए, Range
और Regexp
वर्ग ऐसा करते हैं।
case number
when 1..3
# handle 1, 2 and 3
end
case string
when /pattern/
# handle pattern
end
विशेष रूप से, Proc
वर्ग भी ऐसा करता है!
def greater_than(n)
proc { |x| x > n }
end
case number
when greater_than(2)
# handle number > 2
end
(number > 1) === number.to_i
का मूल्यांकन करेगा