Rust中str又是什么数据类型?
在 Rust 中,str
是一种字符串切片类型,但它本身是一个动态大小类型,无法直接使用。通常情况下,我们会通过 &str
或 Box<str>
等方式来引用 str
,因为 str
类型的数据在内存中具有变长特性,编译器无法在编译时确定其具体大小。
str
的特点和用途
-
动态大小类型(DST)
str
是一种动态大小类型(Dynamically Sized Type,DST),即它的大小不固定。它代表一段 UTF-8 编码的文本,而其长度是可变的(可以是 1 个字节到多个字节的字符序列)。- 由于它的大小在编译时无法确定,所以
str
不能直接使用,只能通过引用类型(&str
)或智能指针(Box<str>
)来访问。
-
字符串切片
&str
是str
的不可变引用,通常称为字符串切片。&str
是最常用的字符串类型,它既可以引用字符串字面量,也可以引用String
的部分或全部内容。- 字符串切片是只读的,无法修改内容。它是 UTF-8 编码的字节序列切片,适合用于读取和传递字符串数据。
-
存储位置
str
可以存储在静态内存区中(比如字符串字面量,"Hello"
就是一个静态的&'static str
)。- 也可以存储在堆中,比如
Box<str>
就是str
的堆分配版本。
常见的 str
用法
-
字符串字面量
- 字符串字面量(如
"Hello, world!"
)的类型是&'static str
,它是一个指向静态内存的字符串切片,生命周期为'static
,表示在程序运行期间始终有效。 - 字符串字面量在编译时确定内容,保存在程序的只读数据段中,性能较高。
let greeting: &str = "Hello, world!";
- 字符串字面量(如
-
与
String
的关系String
是一个可变的字符串类型,存储在堆上,具有所有权。String
可以通过借用的方式转换为&str
,即&String
可以自动解引用为&str
,从而在需要&str
的地方传递String
。- 可以通过
String::as_str
方法获取String
的&str
引用,或者使用&
符号直接获取。
let s: String = String::from("Hello, world!"); let s_slice: &str = &s; // `&String` 自动解引用为 `&str`
-
与
Box<str>
的关系Box<str>
是str
在堆上的所有权类型,可以用于动态字符串存储。- 使用
Box<str>
可以将&str
转换为堆上分配的str
,适用于需要动态大小和所有权的场景。
let boxed_str: Box<str> = "Hello, world!".into();
总结
str
是一种动态大小类型(DST),不能直接使用,需要通过&str
、Box<str>
等引用或指针类型来访问。&str
是str
的不可变引用,通常称为字符串切片,最常见的字符串类型,适合用于只读字符串访问。String
和str
是不同的类型:String
是拥有所有权的可变字符串类型,而&str
是一种不可变的引用,适合轻量级、只读的字符串操作。