2014-09-02 2 views
1

나는 방청 자료에서 io을 사용하여 입력을 읽는 방법을 최근에 배웠습니다. 그러나 콘솔 입력에서 읽을 수있는 ' 간단한'방법이 있는지 궁금합니다. 내 뿌리는 C++로 많이 파고있어 콘솔에서 입력을 가져 오는 것은 std::cin >> var만큼 쉽습니다. 그러나 녹 나는 일을 해요 :이 한 번 입력을 읽지 만 for 루프는 이러한 목표를 달성하기 위해 정말 서투른 방법처럼 보인다콘솔에서 사용자 입력을 한 번 효율적으로 읽음

for line in io::stdin().lines() { 
    print!("{}", line.unwrap()); 
    break; 
} 

. 어떻게하면 쉽게 할 수 있습니까?

답변

4

io::stdin()은 실제로 BufferedReader<>의 포장 stdin입니다. 을 볼 수 있듯이 BufferedReader은 많은 콘텐츠를 추출하는 방법을 제공합니다.

당신은 특히이 : 표준 입력에서 라인을 읽으려고합니다

fn read_line(&mut self) -> IoResult<String> 

(그리고 아마도 오류를 반환).

let a: int = from_str(io::stdin().read_line().unwrap().as_slice()).unwrap() 

를하지만 오류 처리를하지 않습니다 쉽게 실패 할 수 있습니다 : 간단한 코드는 표준 입력에서 int이 될 것이다 읽을 수 있습니다.

더 명시 적 접근 방식은 더 깔끔하게 일을 처리 할 필요 :

let a: int = match from_str(
    match io::stdin().read_line() { 
     Ok(txt) => txt, // Return the slice from_str(...) expects 
     Err(e) => { /* there was an I/O Error, details are in e */ } 
    }.as_slice()) /* match from_str(...) */ { 
     Some(i) => i, // return the int to be stored in a 
     None => { /* user input could not be parsed as an int */ } 
    }; 
+0

Rust는'txt'가 두 번째 구현의 다음 블록에서 일치하기에 충분히 오래 살아 있지 않다는 것을 알려주고 있습니다. 어떻게 그걸 지나갈 수 있습니까? –

+0

고정 된 상태로 유지하면 as_slice()가 첫 번째 일치 명령문의 끝으로 이동해야합니다. –

+0

@SyntacticFructose 오 그래, 실제로 잡을 수 있습니다! 나는 그것을 바로 잡을 것이다. – Levans

4

std::io::stdin()BufferedReader<StdReader>이고, BufferedReaderBuffer 특성을 구현합니다.

match io::stdin().read_line() { 
    Ok(line) => // do whatever you want, line is String 
    Err(e) => // handle error, e is IoError 
} 

여러 라인을 읽고 싶다면

, 첫째 변수에 io::stdin() 결과를 저장 아마 더 나은이 당신이 그것을에 read_line() 메소드를 호출 할 수 있다는 것을 의미한다.

+0

를 현재에서, * read_line * 기능이 하나 개의 매개 변수, * A * 문자열로 변경 가능한 참조를 기대한다. 자세한 내용은 [여기] (https://doc.rust-lang.org/std/io/struct.Stdin.html#method.read_line)를 클릭하십시오. – freinn

관련 문제