• 【Rust】字符串String类型学习


    什么是String

    • Rust的核心语言中只有一个String类型,那就是String slice,str通常被当作是&str的借用。
    • String类型是通过标准库提供的,而不是直接编码到核心语言中,它是一个可增长的、可变的、utf-8编码的类型。
    • strString都是utf-8编码的。如果你想使用一个非utf-8编码的String,可以使用OsString

    创建新的String

    • String实际上是通过包装bytes类型的vector实现的。
    • 使用new方法创建String:let mut s = String::new()
    • 使用to_string方法创建String:
      let data = "initial contents";
      let s = data.to_string();
      let s = "initial contents".to_string();
      
    • 使用String::from方法创建字符串,let s = String::from("initial contents").
    • 根据指定的容量,创建一个空字符串let mut s = String::with_capacity(10);。当字符串长度小于10的时候,不会触发内存重分配。
    • 可以通过len方法查看字符串长度,通过capacity方法查看字符串容量。
    • 通过utf-8类型的vector创建字符串let s_from_vec = String::from_utf8(vec![0xe4, 0xbd, 0xa0, 0xe5, 0xa5, 0xbd]);
    • 如果vector可能包含不合法的utf-8编码则可以用from_utf8_lossy,这将使用占位符替换不合法的utf8字符:
          let invalid_utf8 = vec![0xff, 0xff, 0xff];
          let s_from_invalid_utf8 = String::from_utf8_lossy(&invalid_utf8);
      

    更新String

    Rust不允许使用下标访问字符串里面的单个字符

    使用push_str和push追加字符串

    let mut s = String::from("foo");
    s.push_str("bar");
    // s is foobar
    

    push_str方法不会改变字符串的所有权

    let mut s = String::from("lo");
    s.push('l');
    // s is lol
    

    使用+操作符或者 format!宏连接字符串

    let s1 = String::from("Hello, ");
    let s2 = String::from("world!");
    let s3 = s1 + &s2; // note s1 has been moved here and can no longer be used
    
    let s1 = String::from("tic");
    let s2 = String::from("tac");
    let s3 = String::from("toe");
    
    let s = format!("{s1}-{s2}-{s3}");
    

    扩大字符串容量

    let mut s_origin = String::with_capacity(10);
    s_origin.push('1');
    s_origin.reserve(10);
    println!("{}", s_origin.capacity()); \\ 容量至少是10+1,一般会多分配一些
    

    迭代字符串的方法

    • 可以使用chars方法访问独立的UniCode字符。使用bytes方法访问每一个字节。
    for c in "Зд".chars() {
        println!("{c}");
    }
    

    将String类型转为其他类型

    • 转为bytes数组
    let s = String::from("hello");
    let bytes = s.into_bytes();
    
    • 转为字符串切片&str
    let tmp_s = String::from("hello");
    let s_str = tmp_s.as_str();
    
  • 相关阅读:
    k8s集群搭建操作步骤
    .net餐厅管理系统数据层餐厅服务类修改、查询菜品信息
    【Java编程进阶之路--异常处理】
    43.241.18.123哪些问题会导致服务器里面时间错误
    关于前端开发的起源,架构,变迁
    Unity实现设计模式——迭代器模式
    【Java】控制语句学习笔记
    如何使用飞书快捷指令无感记账,ios版
    cuda 内存模型
    mysql面试题(史上最全面试题,精心整理100家互联网企业,面试必过)
  • 原文地址:https://blog.csdn.net/C2681595858/article/details/140281796