当我的 T 与 Into<String> 绑定时,不满足特征绑定 `String: From<&T>`

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>

use*_*342 6

您的代码的问题是您的向量为您提供了引用,即&String。虽然Into<String>是为 实现的String,但它没有为 实现&String,这需要克隆。您可以实现编译器的建议并添加where T: From<&String>,但它需要额外调整生命周期,并且再次不支持&str.

要同时支持&strString,您可以使用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]。)