2016-01-25 6 views
5

मुझे कुछ बुनियादी I/O सामग्री के साथ कुछ समस्याएं आ रही हैं। विशेष रूप से, पाठ "कृपया अपना नाम दर्ज" के बाद उत्पादन लिखा है मैं अपने नाम में टाइप करें और उसे दर्ज करें:प्रिंटिंग से पहले यह इनपुट क्यों पढ़ता है?

Compiling chat v0.1.0 (file:///home/marcus/dev/rust/chat) 
    Running `target/debug/chat` 
marcus 
Please enter your name: 
Hello, marcus! 

कहाँ:

use std::io; 

fn main() { 
    print!("Please enter your name: "); 

    let mut name = String::new(); 
    match io::stdin().read_line(&mut name) { 
     Ok(_) => println!(""), 
     Err(err) => println!("Could not parse input: {}", err) 
    } 

    println!("Hello, {}!", name.trim()); 
} 

निम्नलिखित उत्पादन देता है पहले "मार्कस" मेरे द्वारा दर्ज किया गया था। इनपुट के इंतजार से पहले प्रोग्राम "कृपया अपना नाम दर्ज करें" प्रिंट क्यों नहीं करेगा?


यह "कुछ भी नहीं" के लिए एक लौटे अगर ResultOk है संभव है? उदाहरण में, Ok() का अर्थ है कि मैंने इनपुट नाम को इनपुट सेव किया है। एक दम बढ़िया। लेकिन इस मामले में Ok() => के साथ मैं क्या करूँ?

उत्तर

7

इनपुट के इंतजार से पहले प्रोग्राम "कृपया अपना नाम दर्ज करें" प्रिंट क्यों नहीं करेगा?

अच्छा, यह था। यह सिर्फ इतना है कि, प्रदर्शन कारणों से, मानक आउटपुट buffered है। लेखन पूरा हो गया, लेकिन यह केवल स्मृति को लिख रहा था। यदि आप इसे वास्तव में उपयोगकर्ता को प्रदर्शित करना चाहते हैं, तो आपको फ्लश ट्रिगर करना होगा। यह या तो एक नई पंक्ति लिख कर, या यह स्पष्ट रूप से कर रही द्वारा किया जा सकता:

io::Write::flush(&mut io::stdout()).expect("flush failed!"); 

// If you "use" `io::Write`... 
io::stdout().flush().expect("flush failed!"); 

इसके अलावा, यह "कुछ भी नहीं" अगर एक लौटे परिणाम ठीक है हो सकता है?

ज़रूर। बस ... कुछ भी नहीं करो।

match io::stdin().read_line(&mut name) { 
    Ok(_) => { /* nothing */ }, 
    Err(err) => println!("Could not parse input: {}", err) 
}  

यहाँ प्रासंगिक आवश्यकता एक match में सभी हथियारों ही परिणाम प्रकार करना है।println! के मामले में, इसका परिणाम () है; एक तरफ एक ऐसा खाली ब्लॉक (या किसी अन्य समारोह है कि () रिटर्न) से, आप बस एक शाब्दिक उपयोग कर सकते हैं:

match io::stdin().read_line(&mut name) { 
    Ok(_) =>(), 
    Err(err) => println!("Could not parse input: {}", err) 
} 
+1

में प्रतीत नहीं होता है, आपको शायद 'अगर एआरआर (त्रुटि) = io :: stdin()। Read_line (और mut name) {println! ("इनपुट पार्स नहीं कर सका: {}", अं); } '। – Veedrac

11

यह print! के लिए documentation पर समझाया गया है। चूंकि print! एक नई लाइन को उत्सर्जित नहीं करता है और stdout लाइन-buffered है, तो आप कोई आउटपुट नहीं देखेंगे। आप कर सकते हैं मैन्युअल रूप से फ्लश stdout:

use std::io::{self, Write}; 

print!("Please enter your name: "); 
io::stdout().flush(); 

अपने दूसरे प्रश्न के लिए आप हमेशा लौट सकते हैं स्पष्ट रूप से इकाई:

Ok(_) =>(), 

तो अपने कार्यक्रम हो जाता है:

use std::io::{self, Write}; 

fn main() { 
    print!("Please enter your name: "); 
    io::stdout().flush(); 

    let mut name = String::new(); 
    match io::stdin().read_line(&mut name) { 
     Ok(_) =>(), 
     Err(err) => println!("Could not parse input: {}", err) 
    } 

    println!("Hello, {}!", name.trim()); 
} 

@Veedrac के रूप में बताया उनके (अब नष्ट कर दिया) टिप्पणी, आप एक if let expressionmatch के स्थान पर read_line के परिणाम पर उपयोग कर सकते हैं:

if let Err(err) = io::stdin().read_line(&mut name) { 
    println!("Could not parse input: {}", err) 
} 
+0

आह, मैं वास्तव में है कि कोशिश की थी लेकिन क्योंकि यह '.flush पहचाना नहीं कुछ त्रुटि मिली() 'समारोह बाहर निकलता है मैं पिछले भाग का उपयोग किया था 'std :: io :: {self, लिखें}; '। क्या आप विस्तार करना चाहते हैं कि '{self, Write}' का अर्थ क्या है? मुझे प्रलेखन – mnordber

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