String 如何在字符串和之间转换;str、Vec<;u8>;及;[u8]?

String 如何在字符串和之间转换;str、Vec<;u8>;及;[u8]?,string,rust,type-conversion,String,Rust,Type Conversion,像我这样的新Rustacean人很难处理这些类型:String,&str,Vec,和[u8] 最后,我希望有一个顿悟,突然明白为什么一些图书馆的电话使用其中一个。在此之前,我需要帮助规划每个惯用转换 鉴于这些类型: let st: &str = ...; let s: String = ...; let u: &[u8] = ...; let v: Vec<u8> = ...; let st:&str=。。。; 让s:String=。。。; 设u:&[u8]=

像我这样的新Rustacean人很难处理这些类型:
String
&str
Vec
和[u8]

最后,我希望有一个顿悟,突然明白为什么一些图书馆的电话使用其中一个。在此之前,我需要帮助规划每个惯用转换

鉴于这些类型:

let st: &str = ...;
let s:  String = ...;
let u:  &[u8] = ...;
let v:  Vec<u8> = ...;
let st:&str=。。。;
让s:String=。。。;
设u:&[u8]=。。。;
设v:Vec=。。。;
我想我已经弄明白了,但它们是地道的吗

&str->String String::from(st)
&str->和[u8]st.as_字节()
字符串->和str s.as_str()
&[u8]->&str str::来自_utf8(u)
Vec->String字符串::from_utf8(v)
最终,我需要这些类型的完整转换表:

let st: &str = ...;
let s:  String = ...;
let u:  &[u8] = ...;
let v:  Vec<u8> = ...;
&str->String
&str->和[u8]
&str->Vec
字符串->&str
字符串->和[u8]
字符串->向量
&[u8]->&str
&[u8]->字符串
&[u8]>Vec
Vec->&str
向量->字符串
向量->和[u8]
From
&str
  • &str->String
    有:
    String::from(st)
    st.to_String()
    st.to_owned()
    • 但我建议你在一个项目中坚持其中一个。
      String::from
      的主要优点是可以将其用作
      map
      方法的参数。因此,您可以经常使用
      x.map(String::from)来代替
      x.map(String::from)
  • &str
    ->
    &[u8]
    st.as\u bytes()完成
  • &str
    ->
    Vec
    &str->和[u8]>Vec
    的组合,即
    st.as\u bytes().to\u Vec()
    st.as\u bytes().to\u owned()
String
  • String->&str
    应仅在可用强制的情况下为
    &s
    ,在不可用强制的情况下为
    s
  • String->和[u8]
    &str->和[u8]
    相同:
    s.as_bytes()
  • String->Vec
    有一个自定义方法:
    s.into_bytes()
和[u8]
  • 和[u8]->Vec
    u.to_owned()
    u.to_Vec()
    完成。它们做同样的事情,但是
    to_vec
    有一点好处,那就是对它返回的类型毫不含糊
  • &[u8]->&str实际上并不存在,这将是通过
    str::from_utf8(u)
    • str::from_utf8(u).unwrap()
      可以工作,但您应该更喜欢更好的错误处理(请参阅)
  • &[u8]->String
    &[u8]->Result->Result的组合
    
    • String::from_utf8(u).unwrap()
      有效,但更喜欢更好的错误处理(请参阅和)
Vec
  • Vec->和[u8]
    在有强制的情况下应该是
    &v
    ,在没有强制的情况下应该是
  • Vec->&str
    Vec->&u8]->Result
    相同,即
    str::from_utf8(&v)
    • str::from_utf8(&v).unwrap()
      有效,但更喜欢更好的错误处理(请参阅)
  • Vec->String
    实际上并不存在,这将是
    Vec->Result
    通过
    String::from_utf8(v)
    • String::from_utf8(v).unwrap()
      有效,但更喜欢更好的错误处理(请参阅)
只要目标不是泛型的,而是显式地分别键入为
&str
&u8]
,就可以使用强制。Rustonomicon有一章介绍了强制站点的更多详细信息


太长,读不下去了
&str->String | String::from(s)或s.to_String()或s.to_owned()
&str->和[u8]| s.作为_字节()
&str->Vec | s.as_bytes().to_Vec()或s.as_bytes().to_owned())
字符串->&str |&s(如果可能的话)*else s.as_str()
字符串->和[u8]| s.作为_字节()
字符串->向量到字节()
&[u8]->&str|s.to_vec()或s.to_owned()
&[u8]->字符串| std::str::from_utf8(s).unwrap(),但不要**
&[u8]->Vec | String::from_utf8(s).unwrap(),但不要**
Vec->&str |&s如果可能的话*其他s.作为_切片()
Vec->String | std::str::from_utf8(&s).unwrap(),但不要**
Vec->&[u8]| String::from_utf8(s).unwrap(),但不要**
*目标应具有显式类型(即,检查器无法推断)
**请正确处理错误

OK,但是如何将单个u8变量更改为string?to_string()似乎不起作用,因为它在当前范围内为类型
u8
喊出“没有名为
as_string的方法”…我想要的是将一个小数字(如32)更改为字符串“32”。