字符串类型间的转换
发布时间:2023-03-21 09:15
最后更新:2023-03-21 09:15
Rust语言在使用久了以后,就会发现程序经常需要在许多常见类型之间进行转换,这其中最有代表性的就是&str
、String
和&OsStr
这一系列的字符串了。不过对于所有的强类型语言来说,都存在这种常用的类型转换。这里对一些常用的类型转换进行一下记录,方便使用时查找。
为了记录和演示方便,首先定义一些类型的变量。
1
2
3
4
5
6
7
|
let s: String = ...; // 包装后的字符串类型
let st: &str = ...; // 字符串字面量类型
let u: &[u8] = ...; // 不定长字节数组类型
let b: [u8; 3] = b"foo"; // 定长字节数组类型表示的字符串
let v: Vec<u8> = ...; // 不定长矢量字节数组
let os: OsString = ...; // 包装后的系统字符串类型
let ost: OsStr = ...; // 系统字符串字面量类型
|
字符串类型之间的转换
源类型 |
目标类型 |
转换方式 |
备注 |
&str |
String |
String::from(st) |
|
&str |
OsStr |
OsStr::new(st) |
|
String |
&str |
&s |
|
String |
OsString |
OsString::from(s) |
|
&OsStr |
&str |
ost.to_str().unwrap() |
|
&OsStr |
String |
ost.to_os_string().into_string().unwrap() |
这个转换是通过OsString 来完成的。 |
&OsStr |
Cow<str> |
ost.to_string_lossy() |
如果字符串内的字符全部有效,将自动转换为Cow<str> ;否则所有无效字符将被自动填充。 |
&OsStr |
OsString |
ost.to_os_string() |
|
OsString |
String |
os.into_string().unwrap() |
|
OsString |
&str |
os.to_str().unwrap() |
|
OsString |
&OsStr |
os.as_os_str() |
|
字符串与字节数组类型之间的转换
源类型 |
目标类型 |
转换方式 |
备注 |
&str |
&[u8] |
st.as_bytes() |
|
&str |
Vec<u8> |
st.as_bytes().to_owned() |
通过&[u8] 完成转换。 |
String |
&[u8] |
s.as_bytes() |
|
String |
Vec<u8> |
s.into_bytes() |
|
&[u8] |
&str |
str::from_utf8(u).unwrap() |
|
&[u8] |
String |
String::from_utf8(u).unwrap() |
|
&[u8] |
OsStr |
OsStr::from_bytes(u) |
需要引用Trait std::os::unix::ffi::OsStrExt 。 |
Vec<u8> |
&str |
str::from_utf8(&v).unwrap() |
通过&[u8] 完成转换。 |
Vec<u8> |
String |
String::from_utf8(v) |
需要引用Trait std::os::unix::ffi::OsStringExt 。 |
Vec<u8> |
OsString |
OsString::from_vec(v) |
|
&OsStr |
&[u8] |
ost.as_bytes() |
需要引用Trait std::os::unix::ffi::OsStrExt 。 |
OsString |
Vec<u8> |
os.into_vec() |
需要引用Trait std::os::unix::ffi::OsStringExt 。 |
字节数组类型之间的转换
源类型 |
目标类型 |
转换方式 |
备注 |
&[u8] |
Vec<u8> |
u.to_owned() 或者u.to_vec() |
|
[u8; 3] |
&[u8] |
&b[..] |
|
[u8; 3] |
&[u8] |
"foo".as_bytes() |
这是直接将字符串字面量转换为字节数组的方法。 |
Vec<u8> |
&[u8] |
&v |
|