当前位置: 首页 > news >正文

【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();
http://www.lryc.cn/news/400702.html

相关文章:

  • 先验概率 后验概率 最大似然估计 自编码器AE
  • qt 鼠标接近某线时,形状变化举例
  • 800块,我从淘宝上买AGV……
  • C++相关概念和易错语法(21)(虚函数、协变、析构函数的重写)
  • SoulApp创始人张璐团队以AI驱动社交进化,平台社交玩法大变革
  • MySQL事务隔离级别+共享锁,排他锁,乐观锁,悲观锁
  • Zynq系列FPGA实现SDI编解码转SFP光口传输(光端机),基于GTX高速接口,提供6套工程源码和技术支持
  • SpringBoot实现图形验证码
  • 【JVM基础01】——介绍-初识JVM运行流程
  • 图数据库 - Neo4j简介
  • C#环境与数据类型
  • jenkins系列-06.harbor
  • kotlin get set
  • Flask包算法服务
  • Flowable(一个开源的工作流和业务流程管理引擎)中与事件相关的一些核心概念
  • 深度解析:景区客服系统如何助力旅游业可持续发展
  • 风险评估:IIS的安全配置,IIS安全基线检查加固
  • uniapp 截取两条数据 进行页面翻页滚动
  • python笔记(转存ipynb)------1
  • excel系列(二) - 利用 easypoi 快速实现 excel 文件导入导出
  • 邀请函|2024第八届中国太阳能电池浆料与金属化技术展
  • 图像边缘检测:技术原理与算法解析
  • 【Python星启航】少儿编程精英启蒙之旅 - 大纲
  • MATLAB的mat文件转换成json文件
  • STM32第九课:STM32-基于标准库的42步进电机的简单I/O控制(附电机教程,看到即赚到)
  • 文件安全传输系统,如何保障信创环境下数据的安全传输?
  • 论文分享|AAAI2024‘北航|用大语言模型缩小有监督和无监督句子表示学习的差距
  • vue3相比于vue2有哪些新特性?
  • Gooxi受邀参加第三届中国数据中心服务器与设备峰会
  • 3个实现前端节流的方法,附代码。