Rust语言之字符串

文章目录

  • 一、字符
  • 二、字符串
    • 1.&str
    • 2.string
      • 创建字符串
      • 遍历字符串
      • 变更字符串
      • 指定位置插入字符串
      • 字符串拼接
      • 宏拼接(format!)
  • 三、切片
    • 1.字符串切片
    • 2.数组(向量)切片


Rust语言设计官方教程

一、字符

Rust提供char为字符存储变量类型,与其他语言不同的是,char占4位,存储的是Unicode字符。
由于Rust中限制比较严格,所以Ascii码和字符直接的转换需要指定每个数据的类型

fn main() {let mut s = 'c';println!("value:{}",s); //value:cs = 65u8 as char;println!("1.after:{}",s);//1.after:Alet i:u8 = 'a' as u8;s = i as char;println!("char:{},ascii:{}",s,i);//char:a,ascii:97
}

二、字符串

Rust语言中,字符串分为两种&str 和 string

  • &str 是一种引用类型,是无法修改字符串的内容
  • string 是标准库中提供的一个存储方式,可以对字符串进行修改、追加等操作

1.&str

fn main() {let s:&str = "hello world";println!("s value:{}",s); //s value:hello world
}

2.string

字符串(String)类型由 Rust 标准库提供,而不是编入核心语言,它是一种可增长、可变、可拥有、UTF-8 编码的字符串类型。

创建字符串

fn main() {let mut s = String::new(); //创建一个空字符串s.push_str("hello"); //追加字符串println!("s value:{}",s); //s value:hellolet s1 = String::from("hello");println!("s1 value:{}",s1); //s1 value:hellolet s_t = "hello";let s2 = s_t.to_string();println!("s2 value:{}",s2); //s2 value:hello
}

遍历字符串

# chars方法:
fn main() {let s = "hello,world!".to_string();for i in s.chars(){println!("value:{}",i);}
}
value:h
value:e
value:l
value:l
value:o
value:,
value:w
value:o
value:r
value:l
value:d
value:!# bytes方法
fn main() {let s = "hello,world!".to_string();for i in s.bytes(){println!("ascii value:{}",i);}
}
ascii value:104
ascii value:101
ascii value:108
ascii value:108
ascii value:111
ascii value:44
ascii value:119
ascii value:111
ascii value:114
ascii value:108
ascii value:100
ascii value:33

变更字符串

# replace 方法
fn main() {let mut s = String::from("Hello, world!");  println!("value : {}",s);  // Hello, world!s = s.replace("world", "Rust");  println!("after : {}", s); // Hello, Rust!
}

指定位置插入字符串

# insert_str 方法
fn main(){let mut s = String::from("world");  s.insert_str(3, " Hello ");  println!("{}", s); // wor Hello ld
}

字符串拼接

# 使用+fn main(){let s1 = String::from("Hello, ");let s2 = String::from("world!");let s3 = s1 + &s2; println!("{}",s3); //Hello, world!
}

注意:&符号是引用,s1前面没有加&,所以s1后面不能再用了

fn main(){let s1 = String::from("Hello, ");let s2 = String::from("world!");let s3 = s1 + &s2; println!("{}",s3); //Hello, world!println!("{}",s1);
}
Compiling hello v0.1.0 (/home/kali/Desktop/ctf/script/RustPro/hello)
error[E0382]: borrow of moved value: `s1`--> src/main.rs:6:19|
2 |     let s1 = String::from("Hello, ");|         -- move occurs because `s1` has type `String`, which does not implement the `Copy` trait
3 |     let s2 = String::from("world!");
4 |     let s3 = s1 + &s2; |              -- value moved here
5 |     println!("{}",s3); //Hello, world!
6 |     println!("{}",s1);|                   ^^ value borrowed here after move|= note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
help: consider cloning the value if the performance cost is acceptable|
4 |     let s3 = s1.clone() + &s2; |                ++++++++For more information about this error, try `rustc --explain E0382`.
error: could not compile `hello` (bin "hello") due to 1 previous error

解决方法:

  • 使用硬拷贝 :let s3 = s1.clone() + &s2;

宏拼接(format!)

fn main(){let s1 = "hello";let s2 = "world";let s3 = format!("{},{}!",s1,s2);println!("value : {}",s3); // value : hello,world!println!("s1 :{}; s2 :{}",s1,s2); //s1 :hello; s2 :world
}

三、切片

切片(slice)允许你引用集合中一段连续的元素序列,而不用引用整个集合。

1.字符串切片

fn main(){let s1 = String::from("Hello, world!");let answer = &s1[0..5];println!("{}",answer); // Hello
}

2.数组(向量)切片

fn main(){let mut vec = vec![1,2,3,4,5];let slice = &mut vec[1..3];println!("slice value:{:?}",slice); // [2,3]slice[0]=100;println!("slice after:{:?}",slice); // [100,3]println!("vce after:{:?}",vec); //[1,100,3,4,5]
}

由于切片是引用类型,所以修改了切片就等于修改了原数组向量;又因为字符串(String)是一个由字符组成的集合,但不同于其他一些语言,Rust中的字符串不是通过索引直接访问其字符的简单字节数组。所以不能通过这种方式去修改string。

fn main(){let mut s1 = String::from("Hello, world!");let answer = &mut s1[0..5];println!("{}",answer); // Helloanswer[0] ='S';println!("{}",answer)
}Compiling hello v0.1.0 (/home/kali/Desktop/ctf/script/RustPro/hello)
error[E0277]: the type `str` cannot be indexed by `{integer}`--> src/main.rs:5:12|
5 |     answer[0] ='S';|            ^ string indices are ranges of `usize`|= help: the trait `SliceIndex<str>` is not implemented for `{integer}`= note: you can use `.chars().nth()` or `.bytes().nth()`for more information, see chapter 8 in The Book: <https://doc.rust-lang.org/book/ch08-02-strings.html#indexing-into-strings>= help: the trait `SliceIndex<[_]>` is implemented for `usize`= help: for that trait implementation, expected `[_]`, found `str`= note: required for `str` to implement `Index<{integer}>`For more information about this error, try `rustc --explain E0277`.
error: could not compile `hello` (bin "hello") due to 1 previous error

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/678395.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt知识点总结目录

一.Qt安装配置和创建项目 Qt所有版本下载地址 Qt安装配置教程windows版&#xff08;包括&#xff1a;Qt5.8.0版本&#xff0c;Qt5.12&#xff0c;Qt5.14版本下载安装教程&#xff09;&#xff08;亲测可行&#xff09; QT从入门到入土&#xff08;一&#xff09;——Qt5.14.…

Linux操作系统基础(八):Linux的vi/vim编辑器

文章目录 Linux的vi/vim编辑器 一、vi/vim编辑器介绍 二、打开文件 三、VIM编辑器的三种模式(重点) 四、命令模式相关命令 五、底行模式相关命令 Linux的vi/vim编辑器 一、vi/vim编辑器介绍 vi是visual interface的简称, 是Linux中最经典的文本编辑器 vi的核心设计思想…

技术精英求职必备:网络安全工程师简历制作全指南

简历编写核心原则 撰写针对网络安全工程师职位的简历时&#xff0c;关键在于准确展现您在网络安全领域的专业技能、项目经验和技术成就。简历应作为您展示安全策略制定、风险管理、入侵检测和响应能力的窗口。确保每一项经历和技能都紧密贴合网络安全工程师的角色要求。具体的…

在 Windows上恢复删除照片的 4 种有效方法

您是否曾在 Windows 7/8/10/11 中不小心删除过照片&#xff1f;如何轻松快速地恢复已删除的照片&#xff1f;在这里这篇文章列出了几种在Windows 11/10/8/7中恢复已删除照片的可行方法&#xff0c;而MiniTool数据恢复软件 是丢失照片恢复的最佳选择。 意外删除的照片 根据一项…

蓝桥杯官网练习题(翻转)

问题描述 小蓝用黑白棋的 n 个棋子排成了一行&#xff0c;他在脑海里想象出了一个长度为 n 的 01 串 T&#xff0c;他发现如果把黑棋当做 1&#xff0c;白棋当做 0&#xff0c;这一行棋子也是一个长度为 n 的 01 串 S。 小蓝决定&#xff0c;如果在 S 中发现一个棋子…

口腔助手|口腔挂号预约小程序|基于微信小程序的口腔门诊预约系统的设计与实现(源码+数据库+文档)

口腔小程序目录 目录 基于微信小程序的口腔门诊预约系统的设计与实现 一、前言 二、系统功能设计 三、系统实现 1、小程序前台界面实现 2、后台管理员模块实现 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&#xff1a; 五、核心代码 六、论文参考 七、最新…

20190726 ApacheHttpClient-自签证书与系统证书共存

要使用HTTPClient-4.5.2做一些连接&#xff1b;但是有的域名是使用的自签证书&#xff0c;有的是CA签发证书&#xff1b;同时又不想跳过证书验证又想使用一个HTTPClient&#xff1b; 如果单单实现验证只使用自签证书或者只使用CA证书的域名比较简单&#xff1b;前者只需要new l…

【调试】pstore原理和使用方法总结

什么是pstore pstore最初是用于系统发生oops或panic时&#xff0c;自动保存内核log buffer中的日志。不过在当前内核版本中&#xff0c;其已经支持了更多的功能&#xff0c;如保存console日志、ftrace消息和用户空间日志。同时&#xff0c;它还支持将这些消息保存在不同的存储…

Avalonia 虚拟化

应用虚拟化技术是管理大量数据时优化性能的一种方法&#xff0c;特别是在使用如Avalonia这样的UI框架时。虚拟化可以帮助减少内存使用并提高应用的响应速度&#xff0c;因为它只加载用户可以看到的元素&#xff0c;而不是全部数据。以下是Avalonia中使用虚拟化的一个基本例子&a…

根据loss 曲率自动微调学习率代码示例

根据loss 曲率自动微调学习率代码示例 代码代码解析代码 from tqdm import tqdm from yan import CvFo import paddle import pandas as pd import numpy as npdef get_loss(loss):loss = np.array

JavaScript 遍历文档生成目录结构

JavaScript 遍历文档生成目录结构 要遍历 HTML 文档并生成目录结构&#xff0c;你可以使用 JavaScript 来进行 DOM 操作和遍历。以下是一个简单的示例代码&#xff0c;演示了如何遍历文档中的标题元素&#xff08;例如 <h1>、<h2>、<h3> 等&#xff09;&…

Rust基础拾遗--核心功能

Rust基础拾遗 前言1.所有权与移动1.1 所有权 2.引用3.特型与泛型简介3.1 使用特型3.2 特型对象3.3 泛型函数与类型参数 4.实用工具特型5.闭包 前言 通过Rust程序设计-第二版笔记的形式对Rust相关重点知识进行汇总&#xff0c;读者通读此系列文章就可以轻松的把该语言基础捡起来…

input框中添加一个 X(关闭/清空按钮)

要在输入框&#xff08;<input> 元素&#xff09;中添加一个 X&#xff08;关闭/清空按钮&#xff09;&#xff0c;可以使用 CSS 和 JavaScript 实现。 HTML&#xff1a; <div class"input-container"><input type"text" id"myInput…

在VSCode中创建Java项目

在VSCode中创建Java项目 首先&#xff0c;保证安装了Java的JDK. WinR -> 输入cmd -> 输入 java -version -> 然后可以看到安装的JDK版本&#xff0c;如果没安装可以去找教程。 JDK安装参考教程 打开VSCode&#xff0c;打开扩展&#xff08;Ctrl Shift S&#xff…

linux驱动开发之常见面试问题

linux驱动开发之常见面试问题 新增驱动的基本操作寄存器基址怎么映射&#xff1f;probe里的常规操作。驱动中通常会定义一个私有结构体&#xff0c;里面包含一些内核结构体&#xff0c;但注册的时候只注册了某个成员&#xff0c;怎么找到这个私有结构体。什么是container_of 如…

vector基本用法(可变长数组)

一.初始化 1.vector<数据类型> 变量名&#xff1b; 2.vector<数据类型> 变量名&#xff08;n&#xff09;&#xff1b; 3.vector<数据类型> 变量名 &#xff08;n,x); 例子&#xff1a;1.vector<int> v;——> v[ ] (空的) 2.vector<…

FreeRTOS.chg脚本出现意外状态

PE代码生成的时候遇到这么个问题 警报如下 Description Resource Path Location Type ERROR: Unexpected status of script: Beans\FreeRTOS\FreeRTOS.chg, please contact Freescale support. M18_BMCU FreeRTOS Processor Expert Problem 意思就是这个脚本文件有问题&…

Linux第45步_通过搭建“DNS服务器”学习图形化配置工具

学习的意义&#xff1a;通过搭建“DNS服务器”&#xff0c;来学习“图形化配置工具”。“DNS服务器”&#xff0c;我们用不到&#xff0c;但为后期移植linux系统服务&#xff0c;因为在移植系统时&#xff0c;需要用到这个“图形化配置工具”。 1、“menuconfig图形化配置工具…

93 log4j-slf4j-impl 搭配上 log4j-to-slf4j 导致的 StackOverflow

前言 呵呵 最近想要 做一个 mongo 低版本的客户端读取高版本的服务端传递过来的数据造成的一个错误的时候, 出现了这样的问题 引入了 mongo-java-driver 之后, 使用相关 api 的时候会触发 com.mongo.internal.connection.BaseCluser 的初始化, 其依赖的 Loggers 间接的依赖…

C++构造和折构函数详解,超详细!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家龙年好呀&#xff0c;今天我们来学习一下C构造函数和折构函数。 文章目录 1.构造函数 1.1构造函数的概念 1.2构造函数的思想 1.3构造函数的特点 1.4构造函数的作用 1.5构造函数的操作 1.6构造函数…