首页 > 其他分享 >Rust从入门到精通08-字符串

Rust从入门到精通08-字符串

时间:2022-10-04 10:33:11浏览次数:52  
标签:mut 入门 08 类型 str 字符串 Rust String

Rust 字符串相对于其它语言有点复杂,主要是跟所有权有关。

Rust 字符串涉及两种类型:&str 和 String

1、&str-字面量

str 是 Rust 的内置类型,&str 是 str 的借用。可以理解为字符串字面量。

Rust从入门到精通08-字符串_字符串

注意:Rust 字符串不能视为 char 类型的数组。

因为char 类型是 4 字节长度,存储的内容是 Unicode Scalar Value;而Rust 字符串内部默认是使用 utf-8 编码格式的,所以字符串不能视为 char 类型数组,反而更接近 u8 类型的数组。

1.1 O(n) 索引操作

获取字符串的第 i 个元素,可以通过如下方法:

fn main() {
let str = "123";
let first = str.chars().nth(0);
println!("{:?}",first);//Some('1')
}

并不能通过 str[i] 的形式来获取第 i 个元素。str.chars().nth() 的方式时间复杂度为 O(n),因为我们前面说过,Rust 字符串使用 UTF-8 编码,这是一种变长编码格式,我们必须要从头开始遍历一遍,否则不知道第 i 个元素到底在哪。

1.2 内存分配

字符串字面量,在编译时就知道其内容,它的文本内容会直接硬编码到最终的可执行文件里。

由于其不可变性,使得它速度快、高效。

2、String

和 &str 类型相比,String 类型具有管理内存空间的权利。

&str 类型是对一块字符串区间的借用,它对所指向的内存空间没有所有权,即使 mut &str 也是。

比如:

let str : &str = "hello"

我们并没有办法对 str 扩容,在其后面增加内容。但String 类型可以:

fn string_test(){
let mut string = String::from("123");
string.push_str("4");
println!("{}",string);//1234
}
2.1 自动转换&str

由于 String 类型实现了(解引用) Deref[Target=str] ,所以很多情况下,&String 类型可以自动转换成 &str 类型。

//字符串大写转换
fn capitalize(substr : &mut str){
substr.make_ascii_uppercase();
}
fn main() {
let mut s = String::from("Hello World");
capitalize(&mut s);
println!("{}",s)//Hello World
}

capitalize 函数需要的形参是 &mut str,可我们调用的时候传入的参数类型是 &mut String,这里能够编译通过,说明编译器给我们做了自动类型转换。

在 capitalize 函数内部,有权修改 &mut str 所指向的内容,但是无法给这个字符串扩容或者释放内存。

标签:mut,入门,08,类型,str,字符串,Rust,String
From: https://blog.51cto.com/u_12749768/5731102

相关文章

  • WEB开发入门
    ​​前端基础之HTML​​​​前端-form表单与CSS​​​​前端CSS样式操作​​​​前端JavaScript​​​​前端基础之BOM与DOM操作​​​​前端之JQuery​​​​前端框架之Boo......
  • MySQL数据库入门
    ​​初识数据库​​​​MySQL操作表和表记录​​​​单表查询进阶与多表查询​​​​Python操作MySQL以及数据库索引​​​​MySQL补充和备份​​......
  • Kubernetes入门
     目录持续更新...​​Kubernetes架构介绍​​​​Kubernetes集群环境准备​​​​Docker安装​​​​CA证书制作​​​​ETCD集群部署​​​​Master节点部署​​​​Node......
  • Python从入门到放弃
    目录​​第一章Markdown编辑器​​​​第二章计算机基础知识​​​​第三章进入python世界(基础)​​​​第四章面向对象编程​​​​第五章网络编程​​​​第六章并......
  • 使用flask入门一个测试平台01-模型设计
    前言​ 在去年的年中,我一时冲动写了一个基于flask开发的测试平台,然后把服务托管在了腾讯云上,本来想是写文章分享的怎么开发的,但是一直没有写。如今一年已经过去了,服务器也......
  • Spring Cloud入门
    简介微服务是由springboot开发的一个个的模块,是一个个独立的进程springcloud是微服务全家桶springcloud通过网关调用多个负载均衡(微服务)springboot是以数字作为版本,spring......
  • Cit 入门操作笔记
    Git操作入门   Git  是一个快速、可扩展的 分布式版本控制系统 ,它具有极为丰富的命令集,对内部系统提供了高级操作和完全访问.Git与你熟悉的大部分版本控制系统的......
  • 008.beanScope的属性
                   ......
  • Luogu P3469 [POI2008]BLO-Blockade(tarjan求割点)
    题目链接:https://www.luogu.com.cn/problem/P3469 [POI2008]BLO-Blockade题面翻译B城有$n$个城镇,$m$条双向道路。每条道路连结两个不同的城镇,没有重复的道路,所有......
  • Redis入门(四):springboot整合redis
    案例一​​demo​​​为​​chnx/springboot/redis01​​创建springboot项目,导入redis依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>s......