我需要在每一行上解析一个文件

<string><space><int><space><float>

例如

abce 2 2.5

在C中,我会做:

scanf("%s%d%f", &s, &i, &f);

在Rust中,我怎样才能轻松且惯用地做到这一点?

推荐答案

标准库不提供此功能.你可以用宏自己写.

macro_rules! scan {
    ( $string:expr, $sep:expr, $( $x:ty ),+ ) => {{
        let mut iter = $string.split($sep);
        ($(iter.next().and_then(|word| word.parse::<$x>().ok()),)*)
    }}
}

fn main() {
    let output = scan!("2 false fox", char::is_whitespace, u8, bool, String);
    println!("{:?}", output); // (Some(2), Some(false), Some("fox"))
}

宏的第二个输入参数可以是a&;str、char或相应的闭包/函数.指定的类型必须实现FromStr特性.

请注意,我很快就把它放在了一起,所以它还没有经过彻底的测试.

Rust相关问答推荐

关联类型(类型参数)命名约定

如何找到一个数字在二维数组中的位置(S)?

返回的future 不是`发送`

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

在执行其他工作的同时,从共享裁判后面的VEC中删除重复项

如何获取Serde struct 的默认实例

如何为 struct 字段设置新值并在Ruust中的可变方法中返回旧值

铁 rust 中的泛型:不能将`<;T作为添加>;::Output`除以`{Float}`

定义只有一些字段可以缺省的 struct

为什么Deref类特征不构成?

为什么切片时需要参考?

需要一个有序向量来进行 struct 初始化

decltype、dyn、impl traits,重构时如何声明函数的返回类型

使用 traits 时,borrow 的值不会存在足够长的时间

无法理解 Rust 对临时值的不可变和可变引用是如何被删除的

在异步 Rust 中,Future 如何确保它只调用最近的 Waker?

为什么 &i32 可以与 Rust 中的 &&i32 进行比较?

如何解析 Rust 中的 yaml 条件字段?

在 Rust 中有条件地导入?

当值是新类型包装器时,对键的奇怪 HashMap 生命周期要求