Rust字符串的介绍和用法

本文概述

  • String
  • &STR
  • 黑白相差’ String’ 和’ &str’ 。
  • 创建一个新的字符串
  • 更新字符串
  • 索引成字符串
  • 切片字符串
  • 遍历字符串的方法
【Rust字符串的介绍和用法】Rust包含两种类型的字符串:&str和String。
String
  • 字符串被编码为UTF-8序列。
  • 在堆内存中分配了一个字符串。
  • 字符串的大小可以增长。
  • 它不是以零结尾的序列。
&STR
  • ‘ &str’ 也称为字符串切片。
  • 它用&[u8]表示以指向UTP-8序列。
  • ‘ &str’ 用于查看字符串中存在的数据。
  • 它的大小是固定的, 即无法调整大小。
黑白相差’ String’ 和’ &str’ 。
  • 字符串是可变的引用, 而&str是对字符串的不可变引用, 即, 我们可以更改String的数据, 但是&str的数据无法操作。
  • 字符串包含其数据的所有权, 而&str没有所有权, 它从另一个变量借用它。
创建一个新的字符串 创建字符串的方式与创建矢量类似。让我们来看一下:
创建一个空字符串:
Let mut s = String::new();

在上面的声明中, String是使用new()函数创建的。现在, 如果要在声明时初始化String, 可以使用to_string()方法来实现。
  • 在数据上实现to_string()方法:
let a = "srcmini"; let s = a.to_string();

  • 我们还可以直接在字符串文字上实现to_string方法:
let s = "srcmini".to_string();

让我们通过一个例子来理解这一点:
fn main(){let data="http://www.srcmini.com/srcmini"; let s=data.to_string(); print!("{} ", s); let str="tutorial".to_string(); print!("{}", str); }

输出
srcmini tutorial

  • 创建String的第二种方法是使用String :: from函数, 这等效于String :: new()函数。
让我们通过一个简单的例子来理解这一点:
fn main(){let str = String::from("srcmini tutorial"); print!("{}", str); }

输出
srcmini tutorial

更新字符串 我们可以通过将更多数据推入String来更改String的大小和String的内容。我们还可以使用format宏的” +” 运算符!连接字符串值。
Rust字符串的介绍和用法

文章图片
  • 用push_str和push附加到字符串
push_str():我们可以使用push_str()函数来增加String的大小。它将内容附加在字符串的末尾。假设s1和s2是两个字符串, 我们想将字符串s2附加到字符串s1上。
s1.push_str(s2);

让我们通过一个简单的例子来理解这一点:
fn main(){let mut s=String::from("java is a"); s.push_str(" programming language"); print!("{}", s); }

输出
java is a programming language

push_str()函数不获取参数的所有权。让我们通过一个简单的例子来了解这种情况。
fn main(){let mut s1 = String::from("Hello"); let s2 = "World"; s1.push_str(s2); print!("{}", s2); }

输出
World

如果push_str()函数拥有参数的所有权, 则程序的最后一行将不起作用, 并且s2的值将不会被打印。
push():push()函数用于在字符串末尾添加单个字符。假设字符串是s1, 而字符ch将添加到字符串s1的末尾。
s1.push(ch);

让我们看一个简单的例子:
fn main(){let mut s = String::from("java"); s.push('c'); print!("{}", s); }

输出
javac

  • 与” +” 运算符或格式宏串联
‘ +’ 运算符:’ +’ 运算符用于连接两个字符串。让我们看看:
let s1 = String::from("srcmini "); let s2 = String::from("tutorial!!"); let s3 = s1+& s2;

让我们看一个简单的例子:
fn main(){ let s1 = String::from("srcmini"); let s2 = String::from(" tutorial!!"); let s3 = s1+& s2; print!("{}", s3); }

输出
srcmini tutorial!!

在上面的示例中, s3包含两个字符串串联的结果, 即srcmini tutorial。 “ s1” 不再有效, 我们根据使用’ +’ 运算符时所调用方法的签名使用s2的引用, 即&s2。 ” +” 运算符调用add()方法, 其声明如下:
fn add(self, s:& str)-> String{ }

首先, s2具有” &” 运算符, 这意味着我们要添加对s1的引用。根据add()函数的签名, 我们可以将&str添加到String中, 并且我们不能将两个字符串值加在一起。但是根据add()方法中指定的第二个参数, s2的类型是&String而不是&str。但仍然可以在add方法中使用s2, 因为编译器会将&string强制转换为&str。因此, 可以说, 当我们调用add()方法时, Rust使用了deref强制。
其次, add()函数的第一个参数是self, 而add()获取self的所有权。这意味着在语句let s3 = s1 +&s2; 之后s1不再有效。
  • 格式!巨集
    • 当我们要连接多个字符串时, 在这种情况下, 使用’ +’ 运算符变得非常笨拙。要连接多个字符串, 首选使用格式宏。
    • 格式宏的功能与println相似!宏格式宏和println之间的区别!巨集是指巨集格式不会在萤幕上显示, 它会传回字串的内容。
让我们通过一个简单的例子来理解这一点:
fn main(){ let s1 = String::from("C"); let s2 = String::from("is"); let s3 = String::from("a"); let s4 = String::from("programming"); let s5 = String::from("language."); let s = format!("{} {} {} {} {}", s1, s2, s3, s4, s5); print!("{}", s); }

输出
C is a programming language.

索引成字符串 字符串以UTF-8序列编码。因此, 无法为字符串建立索引。让我们通过一个例子来理解这个概念:
fn main() {let s = String::from("srcmini"); print!("{}", s[1]); }

输出
error[E0277]: the trait bound `std::string::String: std::ops::Index< {integer}> ` is not satisfied --> jdoodle.rs:4:17|4 |print!("{}", s[1]); |^^^^ the type `std::string::String` cannot be indexed by `{integer}`|= help: the trait `std::ops::Index< {integer}> ` is not implemented for `std::string::String`error: aborting due to previous error

通过索引访问非常快。但是, 该字符串以UTF-8序列编码, 该序列可以具有多个字节, 并且找到字符串中的第n个字符将证明是昂贵的操作。
切片字符串 字符串中未提供索引, 因为不知道索引操作的返回类型应包含字节值, 字符还是字符串片段。 Rust通过提供[]内的范围而不是单个数字, 提供了一种更具体的索引字符串的方法。
我们看看吧:
let s = "Hello World"; let a = & s[1..4];

在上述情况下, s包含字符串文字, 即Hello World。我们指定[1..4]索引意味着我们正在从索引为1到3的字符串s中获取子字符串。
fn main() {let s = "Hello World"; let a = & s[1..4]; print!("{}", a); }

输出
ell

遍历字符串的方法 我们还可以通过其他方式访问字符串。我们可以使用chars()方法遍历字符串的每个元素。
让我们看一个简单的例子:
fn main() {let s = "C is a programming language"; for i in s.chars(){print!("{}", i); }}

输出
C is a programming language

    推荐阅读