我正在学习一门使用自动化测试的课程.输入以标准输入的形式给出,然后将答案打印到标准输出.

由于输入通常采用由空格分隔的相同类型的一组值的形式,并且我不想一次又一次地编写相同的代码,所以我正在try 编写一个函数来将输入解析为给定类型的向量.然而,我的问题是我想使用泛型来指定函数将try 解析数据的类型.我不知道该怎么做.我当前的代码是:

fn std_in_to_vec(split_on: &str) -> std::io::Result<Vec<T>> {
    // read in stdin line
    let mut stdin_buffer = String::new();
    std::io::stdin().read_line(&mut stdin_buffer).expect("could not read stdin");

    // split and read to vec
    let input: Vec<&str> = stdin_buffer.trim().split(" ").collect();

    // attempt to parse as type
    let mut parsed: Vec<T> = Vec::with_capacity(input.len());
    for val in input {
        parsed.push(val.parse::<T>().expect("could not parse as type"));
    }

    Ok(parsed)
}

我怎么才能让这件事奏效呢?

推荐答案

你就快到了.只需使您的函数泛型超过T:

fn std_in_to_vec<T>(split_on: &str) -> std::io::Result<Vec<T>> {
    // ...
}

您可以在call site中指定想要的此函数的哪个版本.您可以让编译器推断T是什么:

let input: Vec<i32> = std_in_to_vec()?;

或使用turbofish syntax指定它:

let input = std_in_to_vec::<i32>()?;

还要注意,您返回的是io::Result,但您调用的是read_lineexpect.这没有多大意义.或者propagate错误(例如使用?运算符),或者保留panicking(在这种情况下从返回类型中删除io::Result).

我最后的 comments 是,stdin是一个词.

Rust相关问答推荐

在actix—web中使用Redirect或NamedFile响应

在泛型 struct 的字段声明中访问关联的Conant

MacOS(AARCH64)上Ghidra中的二进制补丁导致进程终止

是否有可能同时避免不兼容的不透明类型和代码重复?

当第二个`let`依赖于第一个`let()`时,如何在一行中有多个`let()`?

通过不同的字段进行散列和排序的 struct (需要不同的EQ实现)

如何点击()迭代器?

为昂贵的for循环制作筛子

如何修复&q;无法返回引用函数参数的值在异步规则中返回引用当前函数&q;拥有的数据的值?

为什么RefCell没有与常规引用相同的作用域?

如何获取光标下的像素 colored颜色 ?

结果流到 Vec 的结果:如何避免多个into_iter和collect?

Rust 重写函数参数

Rust 中的内存管理

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

返回引用字符串的future

没有分号的返回表达式的性能是否比使用返回更好?在Rust ?

如何在 Rust 中编写涉及异步的重试函数

我如何将 google_gmail1::Gmail> 传递给线程生成?

在 Traits 函数中设置生命周期的问题