代码之家  ›  专栏  ›  技术社区  ›  Evan Carroll

Rust:当我的T与Into<String>绑定时,特性绑定“String:From<&T>”不满足

  •  0
  • Evan Carroll  · 技术社区  · 3 年前

    我有以下代码,

    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();
    

    而那个代码正在产生这个错误,

    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
    

    我很困惑为什么这会产生错误,因为我有一个特性 Vec<T> 使得 T 必须执行 Into<String> ,还需要什么?我不明白为什么,我删除了 into() ,我明白

    let mystr: String = vec.get(0).unwrap();
               ------   ^^^^^^^^^^^^^^^^^^^ expected struct `String`, found `&T`
    

    我怎样才能拿到我的 T 在里面 Vec<T> String ? 我这么做的原因 Vec<T> 而不是 Vec<String> 是因为我想支持 Vec<&str>

    1 回复  |  直到 3 年前
        1
  •  4
  •   user4815162342    3 年前

    你的代码的问题是你的向量 参考文献 ,即。 &String 虽然 Into<String> 被琐碎地实现用于 String ,它不是为实现的 &一串 ,这将需要克隆。您可以实现编译器的建议,并添加 where T: From<&String> ,但它需要额外的寿命,而且不会再次支持 &str .

    支持两者 &str 一串 ,您可以使用 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!()
        }
    }
    

    有了这两个以下编译:

    Positionals::try_from(vec!["foo",]);
    Positionals::try_from(vec!["foo".to_owned(),]);
    

    Playground

    旁注:您可以使用 vec[0] 而不是 vec.get(0).unwrap() 。(为了防止矢量发生不必要的移动,只需添加借位,即。 &vec[0] .)