2010-05-22 10 views
66

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

print "Input text: " 
input = gets.strip 

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

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

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

+0

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

उत्तर

67

highline की जाँच करें:

require "highline/import" 
input = ask "Input text: " 
4

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

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

यह वास्तव में एक पंक्ति नहीं है; आप अर्धविराम का उपयोग कर रहे हैं और शायद उनके अनुरोध के सुंदर हिस्से में फिट नहीं होंगे। – alternative

+1

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

64

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

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

name = prompt "Input name: " 
+2

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

+4

5-सेकंड की लिपि के लिए, मैं कहूंगा कि यह जाने का तरीका है। – javanut13

28

एक लाइनर यकीन हैक। अनुग्रहपूर्ण ... बिल्कुल ठीक नहीं है।

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

यह काम करने के लिए बस बदसूरत है! –

+1

मुझे लगता है कि 'इनपुट = (प्रिंट' नाम: '; get.rstrip)' अधिक पठनीय है। लेकिन दोनों समाधानों में 'शून्य' मानों के साथ समस्याएं हैं। रूबी 2.3 में उन्हें 'इनपुट = (प्रिंट' नाम: '; हो जाता है और .rstrip) के साथ कृपा से संभाला जा सकता है। – michau

11

@ Bryn के नेतृत्व के बाद:

def prompt(default, *args) 
    print(*args) 
    result = gets.strip 
    return result.empty? ? default : result 
end 
8

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

require 'readline' 

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

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

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

name = input "What is your name? " 
+0

"नोट: [[' रीडलाइन :: रीडलाइन'] (http://www.ruby-doc.org/stdlib-2.1.1/libdoc/readline/rdoc/Readline.html#method-c-readline)] टर्मिनेट्स रूबी दुभाषिया और इनपुट इनपुट लाइन के दौरान उपयोगकर्ता '^ सी' दबाए जाने के बाद टर्मिनल स्थिति वापस नहीं करता है। " – ma11hew28

+0

मुझे यह पसंद है और @ एंड्रयू ग्रिम के सुझाव 'हाइलाइन/आयात' का उपयोग करने के सर्वोत्तम विकल्पों के रूप में –

1

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

require 'inquirer' 
inputs = Ask.input 'Input text' 
संबंधित मुद्दे

 संबंधित मुद्दे