Note本问题中的代码与Rust 1.0之前的版本有关,但答案已针对Rust 1.0进行了更新.

我无法将字符串转换为整数.

fn main() {
    let input_text = io::stdin()
        .read_line()
        .ok()
        .expect("failed to read line");

    let input: Option<int> = from_str(input_text.as_slice());

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

我在控制台上输入一个数字(例如42),我的程序打印None.

The documentation says这是字符串格式错误时的正常情况,但是我的42有什么问题吗?

推荐答案

你可以拨打str::parse(),但你需要确保read_line正常工作.我们需要一个读者:

use std::io;

fn main() {
    let reader = io::stdin();
}

stdin读取处理输入流的全局缓冲区,还实现了BufRead trait,其中包含read_line method方法.这将可变String作为输入缓冲区,从流中读取所有字节,直到到达换行字节并将它们附加到缓冲区.#expect()方法打开Result;如果是Err,它会对信息和原因感到panic .

use std::io;

fn main() {
    let reader = io::stdin();
    let mut input_text = String::new();
    reader.read_line(&mut input_text).expect("failed to read line");
}

我们现在有了要转换成i32的输入文本.这就是str::parse()将为我们工作的地方,只要我们给它一个要解析的类型.str::trim()是必需的,因为read_line包含缓冲区中的换行字节

use std::io;

fn main() {
    let reader = io::stdin();
    let mut input_text = String::new();
    reader.read_line(&mut input_text).expect("failed to read line");
    let input = input_text.trim().parse::<i32>();
}

我们还没有完成,我们仍然需要确保使用模式匹配成功解析输入.将原始输入缓冲区转换为可用整数所需的所有代码如下:

use std::io;

fn main() {
    let reader = io::stdin();
    let mut input_text = String::new();

    reader.read_line(&mut input_text).expect("failed to read line");

    let input_opt = input_text.trim().parse::<i32>();

    let input_int = match input_opt {
        Ok(input_int) => input_int,
        Err(e) => {
            println!("please input a number ({})", e);
            return;
        }
    };

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

这样编译时不会出现错误或警告.

Rust相关问答推荐

什么是Rust惯用的方式来使特征向量具有单个向量项的别名?

Rust:跨多个线程使用hashmap Arc和rwlock

当一个箱子有自己的依赖关系时,两个人如何克服S每箱1库+n箱的限制?

Box::new()会从一个堆栈复制到另一个堆吗?

取得本地对象字段的所有权

如何正确重新排列代码以绕过铁 rust 借入判断器?

在Rust 中移动原始指针的靶子安全吗

在Rust中声明和定义一个 struct 体有什么区别

`actix-web` 使用提供的 `tokio` 运行时有何用途?

通过异常从同步代码中产生yield 是如何工作的?

在 Rust 中,在需要引用 self 的 struct 体方法中使用闭包作为 while 循环条件

Rust: 目标成员属于哪个"目标家族"的列表是否存在?

内部值发生变化时 Rc 的行为

rust tokio::spawn 在 mutexguard 之后等待

如何创建递归borrow 其父/创建者的 struct ?

If let expression within .iter().any

意外的正则表达式模式匹配

如何为返回正确类型的枚举实现 get 方法?

如何从 many0 传播 Nom 失败上下文?

A 有一个函数,它在 Option<> 类型中时无法编译,但在 Option<> 类型之外会自行编译.为什么?