Rust By Practice:深入理解String类型

Rust By Practice:深入理解String类型

rust-by-practice Learning Rust By Practice, narrowing the gap between beginner and skilled-dev through challenging examples, exercises and projects. rust-by-practice 项目地址: https://gitcode.com/gh_mirrors/ru/rust-by-practice

String类型是Rust中最常用的字符串类型之一,它提供了UTF-8编码、可增长的动态字符串功能。本文将全面介绍String类型的使用方法、内部原理以及与&str的区别。

String基础操作

String类型拥有字符串内容的所有权,存储在堆上,可以动态增长。让我们看一个基础示例:

fn main() {
    let mut s: String = String::from("hello, ");
    s.push_str("world");
    s.push('!');
    
    move_ownership(s);
    
    println!("Success!")
}

fn move_ownership(s: String) {
    println!("ownership of \"{}\" is moved here!", s)
}

在这个例子中,我们:

  1. 使用String::from创建String
  2. 使用push_str追加字符串
  3. 使用push追加单个字符
  4. 展示了String的所有权转移特性

String与&str的区别

String和&str的关系类似于Vec 和&[T]的关系:

  • String:拥有所有权的字符串类型,存储在堆上,可增长
  • &str:字符串切片引用,指向有效的UTF-8序列
fn main() {  
   let mut s = String::from("hello, world");

   // 获取整个字符串的切片
   let slice1: &str = &s[..];
   // 获取部分字符串切片
   let slice2 = &s[..5];
   
   // 需要修改字符串时必须使用String
   let mut s3 = s.clone();
   s3.push('!');
}

内存分配与UTF-8编码

String基于UTF-8编码,这带来了一些特性:

  1. 无法直接通过索引访问字符,因为UTF-8是变长编码
  2. 可以通过切片获取部分字符串,但必须保证切片边界在字符边界上
fn main() {
    let s = String::from("hello, 世界");
    
    // 正确获取字符的方式
    for (i, c) in s.chars().enumerate() {
        if i == 7 {
            assert_eq!(c, '世')
        }
    }
}

String内部结构

String实际上是一个智能指针,包含三个部分:

  1. 指向堆上字节数组的指针
  2. 已使用的长度
  3. 已分配的容量
use std::mem;

fn main() {
    let story = String::from("Rust By Practice");
    let mut story = mem::ManuallyDrop::new(story);

    let ptr = story.as_mut_ptr();
    let len = story.len();
    let capacity = story.capacity();

    // 安全重建String
    let s = unsafe { String::from_raw_parts(ptr, len, capacity) };
    assert_eq!("Rust By Practice", s);
}

性能优化

String在容量足够时不会重新分配内存:

fn main() {
    let mut s = String::with_capacity(25);
    println!("{}", s.capacity()); // 25
    
    s.push_str("hello");
    println!("{}", s.capacity()); // 25
    
    s.push_str(" world");
    println!("{}", s.capacity()); // 25
}

总结

String是Rust中处理字符串的主要类型,理解其所有权语义、UTF-8编码特性以及内部结构对于编写高效、安全的Rust代码至关重要。通过合理使用String和&str,可以在保证安全性的同时获得良好的性能表现。

rust-by-practice Learning Rust By Practice, narrowing the gap between beginner and skilled-dev through challenging examples, exercises and projects. rust-by-practice 项目地址: https://gitcode.com/gh_mirrors/ru/rust-by-practice

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余靖年Veronica

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值