Eva*_*oll 4 string type-conversion traits rust
我有以下代码,
impl<T: Debug + Into<String> + Clone> TryFrom<Vec<T>> for Positionals {
type Error = &'static str;
fn try_from(mut vec: Vec<T>) -> Result<Self, Self::Error> {
let mystr: String = vec.get(0).unwrap().into();
Run Code Online (Sandbox Code Playgroud)
该代码产生了这个错误,
error[E0277]: the trait bound `String: From<&T>` is not satisfied
--> bin/seq.rs:21:43
|
21 | let mystr: String = vec.get(0).unwrap().into();
| ^^^^ the trait `From<&T>` is not implemented for `String`
|
= note: required because of the requirements on the impl of `Into<String>` for `&T`
help: consider introducing a `where` bound, but there might be an alternative better way to express this requirement
Run Code Online (Sandbox Code Playgroud)
我很困惑为什么这会产生错误,因为我有一个必须实现的Vec<T>特征绑定,还需要什么?我不明白这是为什么,我删除了,我明白了TInto<String>into()
let mystr: String = vec.get(0).unwrap();
------ ^^^^^^^^^^^^^^^^^^^ expected struct `String`, found `&T`
Run Code Online (Sandbox Code Playgroud)
我怎样才能T进入?我之所以这样做而不是因为我也想支持。Vec<T>StringVec<T>Vec<String>Vec<&str>
您的代码的问题是您的向量为您提供了引用,即&String。虽然Into<String>是为 实现的String,但它没有为 实现&String,这需要克隆。您可以实现编译器的建议并添加where T: From<&String>,但它需要额外调整生命周期,并且再次不支持&str.
要同时支持&str和String,您可以使用AsRef<str>:
impl<T: Debug + Clone + AsRef<str>> TryFrom<Vec<T>> for Positionals {
type Error = &'static str;
fn try_from(mut vec: Vec<T>) -> Result<Self, Self::Error> {
let mystr: String = vec[0].as_ref().into();
todo!()
}
}
Run Code Online (Sandbox Code Playgroud)
有了以下两个编译:
Positionals::try_from(vec!["foo",]);
Positionals::try_from(vec!["foo".to_owned(),]);
Run Code Online (Sandbox Code Playgroud)
旁注:您可以使用vec[0]代替vec.get(0).unwrap(). (为了防止不必要的移出向量,只需添加借位,即&vec[0]。)