如何使用泛型类型在Rust中实现类似python的输入函数



我制作了一个类似python的输入函数来获取stdin并返回一个String。它运行得很好,我得到了结果,它正在解析为所需的任何数字类型。但是,我决定将解析转移到函数上,并在它上使用泛型类型,然后我出现了一个错误。

这是代码:

fn input<T>(text: &str) -> T {
let mut input = String::new();
println!("{}", text);
std::io::stdin()
.read_line(&mut input)
.expect("Erro ao ler valor");
let input = input.trim().parse::<T>().expect("Erro ao ler valor");
return input;
}

编译错误:

let input = input.trim().parse::<T>().expect("Erro ao ler valor");
^^^^^ the trait `FromStr` is not implemented for `T`

此外,在VSCode中,显示此消息:

main.rs(9, 11): consider restricting type parameter `T`: `: std::str::FromStr`

我想我可以使用枚举来解决这个问题,但很难写下println接受的所有可能的类型,而使用条件语句似乎更糟。到目前为止,我已经研究Rust三天了,我真的不知道正确的方法

编译器告诉您要做什么:

use std::str::FromStr;
fn input<T: FromStr>(text: &str) -> T {
//        ^^^^^^^^^

限制了泛型类型T,并表示它必须实现.parse::<T>()工作所需的FromStr特性(parse函数也限制了T: FromStr(。

进一步阅读:

  • 特征作为参数

最新更新