像我这样的新Rust程序员在处理这些类型时感到困惑:String
, &str
, Vec<u8>
, &[u8]
。
希望能有所领悟,突然明白为什么某些库调用使用其中的一种。在那之前,我需要帮助来映射每个成语化的转换。
鉴于这些类型:
let st: &str = ...;
let s: String = ...;
let u: &[u8] = ...;
let v: Vec<u8> = ...;
我认为我已经搞明白了,但它们是否符合习惯用法?
&str -> String String::from(st)
&str -> &[u8] st.as_bytes()
String -> &str s.as_str()
&[u8] -> &str str::from_utf8(u)
Vec<u8> -> String String::from_utf8(v)
我最终希望得到这些类型的完整转换表:
&str -> String
&str -> &[u8]
&str -> Vec<u8>
String -> &str
String -> &[u8]
String -> Vec<u8>
&[u8] -> &str
&[u8] -> String
&[u8] -> Vec<u8>
Vec<u8> -> &str
Vec<u8> -> String
Vec<u8> -> &[u8]
format!("{}", 5_u8)
,它会返回一个拥有所有权的String
。 - rdxdkrString::from_utf8_lossy(&*s)
将Vec<u8>
转换为丢失信息的字符串。 - Schneems