Generics 解析数字的通用函数失败,返回“0”;未实施FromStr”命令;

Generics 解析数字的通用函数失败,返回“0”;未实施FromStr”命令;,generics,rust,Generics,Rust,我的代码中有一个通用函数: fn test<T>(text: &str) -> T { text.parse::<T>() } 我昨天才开始学习Rust,所以这可能是一个我没有找到答案的非常基本的问题。当您声明泛型类型参数T时,您对该类型一无所知。它可以是i32,String,()或PinkElephant;一个字符串只能解析其中的两个 Rust中限制类型的方法是通过特征边界:我们显式地请求类型的特定行为。比如“此类型可以是任何类型,但我至少希望能

我的代码中有一个通用函数:

fn test<T>(text: &str) -> T {
    text.parse::<T>()
}

我昨天才开始学习Rust,所以这可能是一个我没有找到答案的非常基本的问题。

当您声明泛型类型参数
T
时,您对该类型一无所知。它可以是
i32
String
()
PinkElephant
;一个字符串只能解析其中的两个

Rust中限制类型的方法是通过特征边界:我们显式地请求类型的特定行为。比如“此类型可以是任何类型,但我至少希望能够克隆此类型的一个实例”(这将是
clone
trait)。你可以(也应该!)阅读更多关于特质的话题

那么,您希望您的类型
T
具有什么特性呢?您希望通过使用从字符串创建
T
的实例。
parse()
的函数签名是:

fn parse<F>(&self) -> Result<F, F::Err> 
    where F: FromStr
fn parse<F>(&self) -> Result<F, F::Err> where F: FromStr
你问的这个
expect()
是什么?好。。。这里我们讨论的是另一个主题:错误处理。还有一个,你应该读一下。简而言之:您需要以某种方式处理字符串无效的情况(例如,当您试图解析整数时,
“peter”
expect()
在这里可能是错误的:当解析没有成功时,它只是恐慌(中止线程)


还请记住,有一个编译器错误索引,您可以在其中阅读有关特定错误的更多信息。对于错误E0277。

与错误消息状态类似,
T
需要实现
core::str::FromStr
,以便适用于
parse
函数。
parse
的类型签名为:

fn parse<F>(&self) -> Result<F, F::Err> 
    where F: FromStr
fn parse<F>(&self) -> Result<F, F::Err> where F: FromStr
Ok(2313)

你看过报纸了吗?它解释了基本原理,应该可以帮助您解决问题。
fn parse<F>(&self) -> Result<F, F::Err> where F: FromStr
use std::str::FromStr;

fn test<T: FromStr>(text: &str) -> Result<T, T::Err> {
    text.parse::<T>()
}

fn main() {
    println!("{:?}", test::<u64>("2313"));
}