अब तक का पहला सवाल,
मैंने हाल ही में TTY की खोज की, विशेष रूप से TTY- शीघ्र और मैं जानना चाहूंगा कि क्या कोई तरीका है जिससे मैं रूबी कोड बनाने के लिए अपना प्रोग्राम प्राप्त कर सकता हूं, लक्ष्य फ्लाई पर ट्टी-प्रॉम्प्ट मेनू बनाना और चीजों को डीआरवाई के रूप में रखना है यथासंभव।
अब तक मेरे पास एक त्वरित चयन विधि है:
def menu_selection(menu_name, menu_options)
return $prompt.select(menu_name, menu_options)
end
यह इन पूर्वनिर्धारित मूल्यों को खिलाया जाता है:
main_menu_name = "Main menu:"
main_menu_options = ["Option 1", "Option 2", "Option 3", "Option 4", "Exit"]
इस पूर्वनिर्धारित मेनू में:
selection = ""
while selection != "Exit"
system "clear"
selection = menu_selection(main_menu_name, main_menu_options)
case selection
when "Option 1"
# code
when "Option 2"
# code
when "Option 3"
# code
when "Option 4"
# code
end
end
मेरे कोड में मेरे पास उपरोक्त इन पूर्वनिर्धारित मेनू में से लगभग 6 हैं, क्या इन मेनू को बनाने का कोई तरीका है क्योंकि main_menu_options array.length और चर का उपयोग करते समय में खिलाए गए तत्वों के आधार पर उन्हें कब जेनरेट किया जाता है?
मूल रूप से कुछ ऐसा:
def menu_builder
# *Edits below*
# Builds selection variable with empty string
# Builds while loop with condition
# Builds Case Statement
# n = 1
# while n < main_menu_options.length do |index|
# Build when_n with index_n
# n += 1
end
# Method above builds menu code below (Doesn't have to be a method if something else works
selection = ""
while selection != "Exit"
system "clear"
selection = menu_selection(main_menu_name, main_menu_options)
case selection
when_1 option_1
# code
when_2 option_2
# code
(...) # Continues to build when's and variables
# code
when_n option_n
# code
end
end
किसी भी प्रतिक्रिया/आलोचना की सराहना की और अगर मैंने कुछ गलत पोस्ट किया है तो कृपया मुझे बताएं, चीयर्स।
2 जवाब
जैसा कि @Sergio Tulentsev द्वारा ऊपर उल्लेख किया गया है, आप इसे ruby (until now 2.7)
पर पूरा नहीं कर सकते हैं, लेकिन आप इस मुद्दे पर दूसरे दृष्टिकोण से हमला कर सकते हैं, मुझे लगता है कि आपकी समस्या के लिए सबसे उपयुक्त hash of functions
बनाना है, कुछ इस तरह :
menu_options = {}
menu_options[:option_1] = method(:code_for_option1) #storage the function called code_for_option1 inside the hash
menu_options[:option_1].()
फिर यदि आपको एक नया विकल्प रखने की आवश्यकता है तो आपको इसे संबंधित फ़ंक्शन के साथ हैश में जोड़ना होगा। साथ ही, आपको यह उत्तर उपयोगी हैश में स्टोरेज फ़ंक्शन उपयोगी लग सकता है। आशा है कि उपरोक्त मदद करता है! मैं
मेटाप्रोग्रामिंग के बिना मेनू बनाएं और प्रस्तुत करें
अपने मेनू बनाने के लिए बैश के select
कमांड के व्यवहार का अनुमान लगाना एक उपयोगी तरीका है। उदाहरण के लिए, यदि आप फाइलों की सूची पर कुछ कार्रवाई करना चाहते हैं, तो आप Dir#glob अपना मेनू बनाने और उपयोगकर्ता के चयन तक पहुंचने के लिए। रूबी 2.7.2 का उपयोग करना:
# this will hold your menu options
options = {}
# populate menu with files to select, or
# with whatever else you may want
Dir.glob(?*).each_with_index do |file, idx|
options[idx] = file
end
#=> {0=>"bar", 1=>"baz", 2=>"foo"}
# present menu and prompt
options.each { |key, val| printf "%d) %s\n", key, val }
print 'Selection: '
selection = Integer(gets)
#=> 2
# value to pass to method or case statement
selected = options[selection]
#=> "foo"
यदि आप फ़ाइलों के साथ काम नहीं कर रहे हैं, तो आप अभी भी अपने मेनू विकल्पों को हैश या ऐरे में मैप करने के लिए एक समान दृष्टिकोण का उपयोग कर सकते हैं जिसमें विधि नाम, प्रोसेस, या जो कुछ भी आप कल्पना कर सकते हैं। चूंकि हैश और सरणियाँ रनटाइम पर बनाई जा सकती हैं, यह समस्या को मेटाप्रोग्रामिंग के बजाय कुंजी या अनुक्रमणिका के माध्यम से प्रस्तुति और चयन में से एक में कम कर देता है।
फिर आप चयन, चयनित, और विकल्प के किसी भी संयोजन का उपयोग करके अपनी पसंद की किसी भी क्रिया को लागू कर सकते हैं। चयनित के आधार पर आपको कोई भी ब्रांचिंग करने की आवश्यकता तब मेनू-विशिष्ट केस स्टेटमेंट पर की जा सकती है, बजाय इसके कि Kernel#eval।