रूबी में एक लाइनर एक प्रॉम्प्ट प्रदर्शित करने, इनपुट प्राप्त करने और एक चर को असाइन करने के लिए?


79

अक्सर मैं खुद को निम्न कार्य करते हुए पाता हूं:

print "Input text: "
input = gets.strip

क्या एक लाइन में ऐसा करने का एक सुंदर तरीका है? कुछ इस तरह:

puts "Input text: #{input = gets.strip}"

इसके साथ समस्या यह है कि यह प्रॉम्प्ट प्रदर्शित करने से पहले इनपुट की प्रतीक्षा करता है। कोई विचार?


इसे एक फंक्शन बनाएं जो प्रॉम्प्ट टेक्स्ट लेता है और इनपुट टेक्स्ट देता है? यदि आप कट्टरता प्राप्त करना चाहते हैं और आपको कई प्रॉम्प्ट / इनपुट चक्रों की आवश्यकता है, तो आप फ़ंक्शन को संकेतों की एक सरणी ले सकते हैं और फिर ब्लॉक को लूप कर सकते हैं और प्रत्येक इनपुट प्राप्त कर सकते हैं।
एएसएम

जवाबों:



76

मुझे लगता है कि मार्क-आंद्रे ने जो सुझाव दिया है, उसके साथ कुछ ऐसा हो सकता है कि जाने का तरीका क्या होगा, लेकिन पूरे टन कोड में क्यों लाएं जब आप जिस भी स्क्रिप्ट का उपयोग करने जा रहे हैं उसके शीर्ष पर दो लाइन फ़ंक्शन को परिभाषित कर सकते हैं :

def prompt(*args)
    print(*args)
    gets
end

name = prompt "Input name: "

2
वास्तव में, यह भी ठीक काम करेगा। जब तक आप कुछ इनपुट जाँच जोड़ना चाहते हैं। या कुछ डिफ़ॉल्ट मान। या यह न लिखें कि आप क्या टाइप करते हैं क्योंकि आप पासवर्ड मांगते हैं ...
मार्क-एंड्रे लाफ्यून

4
5 सेकंड की स्क्रिप्ट के लिए, मैं कहूंगा कि यह जाने का तरीका है।
विल रिचर्डसन

1
मैं इस .chompविधि को संलग्न करूंगा, getsअन्यथा चर \nमें अंत में एक नया रेखा वर्ण होगा।
टॉमा निस्टर

32

एक लाइनर हैक सुनिश्चित। सुंदर ... अच्छी तरह से बिल्कुल नहीं।

input = [(print 'Name: '), gets.rstrip][1]

2
मुझे लगता input = (print 'Name: '; gets.rstrip)है कि अधिक पठनीय है। लेकिन दोनों समाधानों में nilमूल्यों की समस्या है। रूबी 2.3 में उन्हें इनायत के साथ संभाला जा सकता है input = (print 'Name: '; gets&.rstrip)
मिचू

14

मुझे पता है कि यह सवाल पुराना है, लेकिन मुझे लगता है कि मैं इनपुट प्राप्त करने के लिए अपने मानक तरीके के रूप में क्या दिखाऊंगा।

require 'readline'

def input(prompt="", newline=false)
  prompt += "\n" if newline
  Readline.readline(prompt, true).squeeze(" ").strip
end

यह वास्तव में अच्छा है क्योंकि यदि उपयोगकर्ता अंत में या शुरुआत में अजीब रिक्त स्थान जोड़ता है, तो यह उन लोगों को हटा देगा, और यह एक इतिहास रखता है कि उन्होंने अतीत में क्या दर्ज किया था ( इसे नहीं trueकरने के falseलिए बदलें ।)। और, यदि ARGVखाली नहीं है, तो इनपुट प्राप्त करने के बजाय, getsकिसी फ़ाइल से पढ़ने का प्रयास करेंगे ARGV। इसके अलावा, Readlineरूबी मानक पुस्तकालय का हिस्सा है ताकि आपको कोई रत्न स्थापित न करना पड़े। इसके अलावा, आप उपयोग करते समय अपने कर्सर को स्थानांतरित नहीं कर सकते gets, लेकिन आप कर सकते हैं Readline

और, मुझे पता है कि विधि एक पंक्ति नहीं है, लेकिन यह तब है जब आप इसे कहते हैं

name = input "What is your name? "

"नोट: [Readline::readline ] इनपुट इनपुट लाइन की प्रतीक्षा करने पर उपयोगकर्ता द्वारा '^ C' दबाए जाने के बाद रूबी दुभाषिया को समाप्त कर देता है और टर्मिनल स्थिति को वापस नहीं करता है।"
15:11 बजे ma11hew28

मुझे यह पसंद है और @Andrew ग्रिम के सुझाव का उपयोग करने के लिए सबसे अच्छा विकल्प के रूप मेंhighline/import
Chux Uzoeto


4

आपके प्रस्तावित समाधान के साथ समस्या यह है कि मुद्रित होने वाली स्ट्रिंग तब तक नहीं बनाई जा सकती जब तक इनपुट पढ़ा, छीन लिया और असाइन नहीं किया जाता है। आप प्रत्येक पंक्ति को अर्धविराम से अलग कर सकते हैं:

$ ruby -e 'print "Input text: "; input=gets.strip; puts input'
Input text: foo
foo

5
यह वास्तव में एक-पंक्ति नहीं है; आप अर्धविराम का उपयोग कर रहे हैं और यह संभवत: उनके अनुरोध के अनुकूल भाग में फिट नहीं होगा।
वैकल्पिक

1
$ माणिक -e 'प्रिंट ("इनपुट टेक्स्ट:") || (इनपुट = get.strip) && (इनपुट डालता है)'
लार्स हग्सथ

1

मैंने पाया इन्क्वायरर संयोग से मणि और मैं वास्तव में इसे पसंद है, मैं यह तरीका अधिक स्वच्छ हालांकि यह अपने आप से इनपुट सत्यापन के अभाव है खोजने के लिए और आसान हाईलाइन से उपयोग करने के लिए,।
आपका उदाहरण इस तरह लिखा जा सकता है

require 'inquirer'
inputs = Ask.input 'Input text'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.