Pet*_*all 5 generics traits rust
我正在尝试通过添加类型变量代替具体类型来改进一些现有代码以使其更通用。
原始代码如下所示:
fn parse_row(text: String) -> Result<Vec<u32>, String> {
text.split(" ")
.map(|s| s.to_owned()
.parse::<u32>()
.map_err(|e| e.to_string())
)
.collect()
}
Run Code Online (Sandbox Code Playgroud)
这是通用版本:
fn parse_row<T>(text: String) -> Result<Vec<T>, String>
where
T: Copy + Debug + FromStr + Display,
{
text.split(" ")
.map(|s| s.to_owned()
.parse::<T>()
.map_err(|e| e.to_string())
)
.collect()
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
fn parse_row(text: String) -> Result<Vec<u32>, String> {
text.split(" ")
.map(|s| s.to_owned()
.parse::<u32>()
.map_err(|e| e.to_string())
)
.collect()
}
Run Code Online (Sandbox Code Playgroud)
<T as core::str::FromStr>::Err指的是与T的FromStr实现相关的类型参数,但我如何表达这种类型——我实际上无法知道——具有Display特征?
这最初令人困惑,因为我不明白Err它指的是哪个- 并认为它是Result. 一旦我发现它FromStr有自己的Err类型参数,我只需要弄清楚如何表达该约束。这是:
fn parse_row<T>(text: String) -> Result<Vec<T>, String>
where
T: Copy + Debug + FromStr,
T::Err: Display,
{
text.split(" ")
.map(|s| s.to_owned()
.parse::<T>()
.map_err(|e| e.to_string())
)
.collect()
}
Run Code Online (Sandbox Code Playgroud)