Skip to content

Latest commit

 

History

History
147 lines (74 loc) · 4.13 KB

sinput.md

File metadata and controls

147 lines (74 loc) · 4.13 KB

[数组,向量,切片][avs.md]

[avs.md]

#标准输入


从键盘得到输入十分简单,但是也要使用一些我们以前没用过的东西,下面的例子读取输入,然后打印出来:

fn main() {
    println!("Type something!");

    let input = std::old_io::stdin().read_line().ok().expect("Failed to read line");

    println!("{}", input);
}

让我们一步一步仔细分析这些代码片段:

std::old_io::stdin();

这里调用了一个函数,stdin(),这个函数在std::old_io模块中 。 和你想的一样,std中的每样东西都是有Rust提供,我们将在稍后的模块系统中讨论,

一直写这种全限定名十分讨厌,我们能使用use语句来导入:

use std::old_io::stdin;

stdin();

最佳实践是不要导入单个函数,而是导入模块,仅仅使用一级限定

use std::old_io;

old_io::stdin();

我们使用上面的风格来更新我们的例子:

 use std::old_io;

fn main() {
    println!("Type something!");

    let input = old_io::stdin().read_line().ok().expect("Failed to read line");

    println!("{}", input);
}

下一个:

.read_line()

这个**read_line()可以被stdin()**返回的结果调用,然会一整行输入,简单漂亮

.ok().expect("Failed to read line");

你还记得这个代码么:

enum OptionalInt {
    Value(i32),
    Missing,
}

fn main() {
    let x = OptionalInt::Value(5);
    let y = OptionalInt::Missing;

    match x {
        OptionalInt::Value(n) => println!("x is {}", n),
        OptionalInt::Missing => println!("x is missing!"),
    }

    match y {
        OptionalInt::Value(n) => println!("y is {}", n),
        OptionalInt::Missing => println!("y is missing!"),
    }
}

不管我们是否有值,我们每次都要匹配查看,虽然我们知道x有一个值,但是match强制我们去处理missing的情况,99%的情况下我们我们想这样,但是有时,我们比编译器更了解,

同样地,read_line()没有返回一行输入的数据,或许会返回一行输入的数据,或许会失败不会返回,或许在我们的程序没有运行在终端是发生,或者作为计划任务一部分时发生,或者在没有标准输入的上下文的地方发生,基于这些原因,read_line返回一个类似OptionalInt类型:一个IoResult类型的数A据,我们没有讨论过IoResult,因为OptionalInt的泛型,你可以认为它是一样的东西,使用于任何类型,不仅仅是i32

Rust给IoResult类型提供了一个方法ok(),和match语句做一样的事情,但是假设我们有一个有效的值,我们在返回结果上调用**expect()**方法,如果我们没有有效的值将会警告我们,在这个例子中,如果我们没有得到输入,我们的程序不会工作,使用这个很不错,在大多数情况下,我们想显示的处理错误信息,如果程序崩溃,**except()**方法会给我们一个错误的信息.

在指南的后面我们会详细了解工作细节,现在有这些基本的理解就可以工作了

回到我们的代码,下面是一个更新版

use std::old_io;

fn main() {
    println!("Type something!");

    let input = old_io::stdin().read_line().ok().expect("Failed to read line");

    println!("{}", input);
}

这么写很长,Rust允许你灵活的使用空格,我们可以这么写

use std::old_io;

fn main() {
    println!("Type something!");

    // here, we'll show the types at each step

    let input = old_io::stdin() // std::old_io::stdio::StdinReader
                  .read_line() // IoResult<String>
                  .ok() // Option<String>
                  .expect("Failed to read line"); // String

    println!("{}", input);
}

或者这样更可读,或者不是,这个你自己选择

这些就是你需要了解的标准输入的全部基本知识,不是很复杂,但是有许多小细节

猜谜游戏