एक प्रोग्राम के लिए कुछ टेस्ट कोड लिखा है, 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()
0
Theo1290 20 अक्टूबर 2021, 16:11

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

और चूंकि आप किसी संख्या की तुलना बूलियन व्यंजक से कर रहे हैं, यह सत्य का मूल्यांकन नहीं करेगा। यदि आपके पास केस स्टेटमेंट में कोई और होता तो इसे कॉल किया जाता।

1
Max 20 अक्टूबर 2021, 18:09
2
वास्तव में यह (number > 1) === number.to_i का मूल्यांकन करेगा
 – 
spickermann
20 अक्टूबर 2021, 17:47
आह धन्यवाद, इसे ठीक किया
 – 
Max
20 अक्टूबर 2021, 18:09

आपके 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
2
Matheus Moreira 20 अक्टूबर 2021, 19:41