एक गैर ब्लॉक घटना के रूप में STDIN.getch (यह संभव है?) - रूबी, आईओ, कंसोल, errno

मैं एंटर के उपयोग के बिना कमांड लाइन से एक वर्ण को तुरंत पढ़ने की कोशिश कर रहा हूं। रूबी (रूबी 1.9.3p374) कोड जिसे मैं उपयोग कर रहा हूं वह निम्नलिखित है:

require "io/console"

ch = STDIN.getch
puts ch

अब तक सबकुछ ठीक चल रहा है, लेकिन अब मैं इस कोड को एक अनन्त लूप के अंदर रखना चाहता हूं जिसमें कुछ अन्य सामान, कुछ ऐसा हो

loop do
puts "..doing stuff.."
ch = STDIN.getch
if ch == "q"
break
end
end

लेकिन यह कोड हमेशा मजबूर करता है कि हम प्रत्येक प्रिंटिंग के बीच एक कुंजी दबाएं। मुझे भी इसी तरह का व्यवहार चाहिए STDIN.read_nonblock विधि लेकिन एक चार दबाने के बाद एंटर कुंजी दबाए बिना।

मूल रूप से मैं "..आइटिंग स्टफ .." प्रिंट करना चाहता हूं, जब तक कि मैं कीबोर्ड पर एक निश्चित कुंजी नहीं दबाता हूं, लेकिन मैं प्रवेश नहीं करना चाहता हूं।

किसी भी तरह की सहायता को आभार समझेंगे। धन्यवाद

उत्तर:

जवाब के लिए 0 № 1

आप हमेशा बिल्ट-इन का उपयोग कर सकते हैं curses पुस्तकालय अपनी बातचीत को संभालने के लिए। यह बहुत शक्तिशाली है और इसका उपयोग कीबोर्ड से चलने वाले टूल जैसे टेक्स्ट एडिटर के निर्माण के लिए किया जाता है।

विकल्प का उपयोग करना है select चुनाव के लिए अगर STDIN पठनीय है। आपका टर्मिनल एक लाइन-बफ़र्ड स्थिति में हो सकता है, इसलिए आपको "समायोजित करने की आवश्यकता है कि एकल कीस्ट्रोक प्राप्त होने से पहले। यह कुछ ऐसा है जो शाप आपके लिए संभाल सकता है।


संबंधित सवाल
सबसे लोकप्रिय