rust的字符串有两种类型: str 和 String
str 和 &str
- str 是被编码成UTF-8的一个字节数组
- str基本不怎么使用,更常用的是它的引用&str
- rust中的字符串被表示为 &'static str (&表示引用,&[...]代表是一个固定大小的不可变的字符串切片。static表示是静态)。
- 在rust中的所有""字符串都被声明成了一个不可变得、静态的变量。
String
- String 是可变的、动态的字符串类型。它是由标准库提供的。
- String 内部是由Vec<u8>封装的动态数组。
String 和 &str 的互相转换
let str = "hello";
// 通过to_string()方法将 &str 转换为 String
let mut y : String = str.to_string();
那么怎么将 String 转换为 &str呢,通过&*操作
fn conver(tar &str) {
println!("convert String to &str");
}
convert(&*y);
- 按照rust的运算顺序,先进行解引用操作*,拿到 String 的字符数组 str,然后在通过&转化为 &str类型。
- 由于String实现了impl Deref<Target=str> for String,所以可以通过* 获取一个str类型。
- 也许使用&就能使编译通过,那是因为rust的编译器会在&后插入足够多的* 来尽可能满足Deref 这个特性,但这个特性会在某些情况下失效,因此,还是将&*写全比较好。
- 需要知道的是,将String转换成&str是非常轻松的,几乎没有任何开销。但是反过来,将&str转换成String是需要在堆上请求内存的,因此,要慎重