Rust中如何获取str类型的值?为何常用&str而非str?
为什么Rust里常用&str,却很少直接用str?
核心原因:str是动态大小类型(DST)
Rust要求绝大多数类型在编译期确定内存大小,但str的长度只有运行时才能知道——它本质是一段UTF-8字节序列的裸数据,没有自带长度信息。这意味着你没法直接声明str类型的变量(比如let s: str = "hi";会直接编译报错),编译器不知道要给它分配多少栈空间,也没法安全地移动或存储它。
&str是str的实用包装
&str是str的不可变引用/切片,它是一个「胖指针」:在64位系统上占16字节,一半存指向str数据的内存地址,一半存字符串的长度。因为大小固定,它可以自由地作为函数参数、变量、返回值使用,这也是它成为Rust字符串处理标配的原因。
怎么获取str类型的值?
虽然不能直接持有str变量,但可以通过间接方式得到str类型的实例:
从固定大小数组转换
把字符数组或字节数组转成&str,底层就是str类型的数据:// 字符数组转&str let char_arr: [char; 3] = ['a', 'b', 'c']; let s: &str = char_arr.as_str(); // UTF-8字节数组转&str let byte_arr: &[u8] = b"hello"; let s: &str = std::str::from_utf8(byte_arr).unwrap();堆上分配的str(Box
) Box<str>是堆上分配的str,属于智能指针。你可以把字符串字面量或String转成Box<str>,它内部指向的就是str类型数据:// 从字面量转Box<str> let boxed_str: Box<str> = "hello world".into(); // 通过解引用得到&str(日常使用还是用&str) let s: &str = &boxed_str;注意:你不能直接把
Box<str>解引用赋值给str变量(let s: str = *boxed_str;会报错),因为还是没法直接持有DST类型。模式匹配中的间接引用
在模式匹配里,你可以间接接触到str,但通常还是以&str的形式处理:match "test" { s => println!("匹配到的字符串是: {}", s), // s是&str,指向底层的str }
日常开发里几乎不需要直接操作str类型,&str已经能覆盖绝大多数字符串读取场景,Box<str>则适合需要堆分配且不想预留额外容量的场景(比String更节省内存)。
内容的提问来源于stack exchange,提问作者doki
相关产品推荐
相关产品推荐

