You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 19:25:29