Rust - 字符串


Rust 中的字符串数据类型可以分为以下几类:

  • 字符串文字(&str)

  • 字符串对象(字符串)

字符串字面量

当编译时已知字符串的值时,使用字符串文字 (&str)。字符串文字是一组字符,它们被硬编码到变量中。例如,让 company="Tutorials Point"。字符串文字可在模块 std::str 中找到。字符串文字也称为字符串切片。

以下示例声明两个字符串文字 - companylocation

fn main() {
   let company:&str="TutorialsPoint";
   let location:&str = "Hyderabad";
   println!("company is : {} location :{}",company,location);
}

默认情况下,字符串文字是静态的。这意味着字符串文字保证在整个程序的持续时间内有效。我们还可以显式地将变量指定为静态,如下所示 -

fn main() {
   let company:&'static str = "TutorialsPoint";
   let location:&'static str = "Hyderabad";
   println!("company is : {} location :{}",company,location);
}

上述程序将生成以下输出 -

company is : TutorialsPoint location :Hyderabad

字符串对象

标准库中提供了 String 对象类型。与字符串文字不同,字符串对象类型不是核心语言的一部分。它在标准库pub struct String中被定义为公共结构。String 是一个可增长的集合。它是可变的 UTF-8 编码类型。String对象类型可用于表示运行时提供的字符串值。String对象是在堆中分配的。

句法

要创建 String 对象,我们可以使用以下任何语法 -

String::new()

上面的语法创建一个空字符串

String::from()

这将创建一个字符串,其中一些默认值作为参数传递给from()方法。

以下示例说明了 String 对象的使用。

fn main(){
   let empty_string = String::new();
   println!("length is {}",empty_string.len());

   let content_string = String::from("TutorialsPoint");
   println!("length is {}",content_string.len());
}

上面的示例创建了两个字符串 - 使用new方法创建一个空字符串对象,使用from方法创建一个来自字符串文字的字符串对象。

输出如下所示 -

length is 0
length is 14

常用方法-字符串对象

先生。 方法 签名 描述
1 新的() pub const fn new() → 字符串 创建一个新的空字符串。
2 to_string() fn to_string(&self) → 字符串 将给定值转换为字符串。
3 代替() pub fn Replace<'a, P>(&'a self, from: P, to: &str) → 字符串 将模式的所有匹配项替换为另一个字符串。
4 as_str() pub fn as_str(&self) → &str 提取包含整个字符串的字符串切片。
5 推() pub fn Push(&mut self, ch: char) 将给定的字符附加到该字符串的末尾。
6 Push_str() pub fn Push_str(&mut self, 字符串: &str) 将给定的字符串切片附加到该字符串的末尾。
7 长度() pub fn len(&self) → usize 返回此字符串的长度(以字节为单位)。
8 修剪() pub fn 修剪(&self) → &str 返回删除了前导和尾随空格的字符串切片。
9 split_whitespace() pub fn split_whitespace(&self) → SplitWhitespace 按空格分割字符串切片并返回迭代器。
10 分裂() pub fn split<'a, P>(&'a self, pat: P) → Split<'a, P> ,其中 P 是模式,可以是 &str、char 或确定拆分的闭包。 返回对此字符串切片的子字符串的迭代器,子字符串由模式匹配的字符分隔。
11 字符() pub fn chars(&self) → 字符 返回字符串切片的字符上的迭代器。

插图:new()

使用new()方法创建一个空字符串对象,并将其值设置为hello

fn main(){
   let mut z = String::new();
   z.push_str("hello");
   println!("{}",z);
}

输出

上述程序生成以下输出 -

hello

插图:to_string()

要访问 String 对象的所有方法,请使用to_string()函数将字符串文字转换为对象类型。

fn main(){
   let name1 = "Hello TutorialsPoint , 
   Hello!".to_string();
   println!("{}",name1);
}

输出

上述程序生成以下输出 -

Hello TutorialsPoint , Hello!

说明:替换()

Replace ()函数有两个参数 - 第一个参数是要搜索的字符串模式,第二个参数是要替换的新值。在上面的示例中,Hello在name1字符串中出现了两次。

替换函数将所有出现的字符串Hello替换为Howdy

fn main(){
   let name1 = "Hello TutorialsPoint , 
   Hello!".to_string();         //String object
   let name2 = name1.replace("Hello","Howdy");    //find and replace
   println!("{}",name2);
}

输出

上述程序生成以下输出 -

Howdy TutorialsPoint , Howdy!

插图:as_str()

as_str ()函数提取包含整个字符串的字符串切片。

fn main() {
   let example_string = String::from("example_string");
   print_literal(example_string.as_str());
}
fn print_literal(data:&str ){
   println!("displaying string literal {}",data);
}

输出

上述程序生成以下输出 -

displaying string literal example_string

说明:push()

Push ()函数将给定的字符附加到该字符串的末尾。

fn main(){
   let mut company = "Tutorial".to_string();
   company.push('s');
   println!("{}",company);
}

输出

上述程序生成以下输出 -

Tutorials

说明:push_str()

Push_str ()函数将给定的字符串切片附加到字符串的末尾。

fn main(){
   let mut company = "Tutorials".to_string();
   company.push_str(" Point");
   println!("{}",company);
}

输出

上述程序生成以下输出 -

Tutorials Point

插图:len()

len ()函数返回字符串中的字符总数(包括空格)。

fn main() {
   let fullname = " Tutorials Point";
   println!("length is {}",fullname.len());
}

输出

上述程序生成以下输出 -

length is 20

插图:修剪()

Trim() 函数删除字符串中的前导空格和尾随空格。请注意,此函数不会删除内联空格。

fn main() {
   let fullname = " Tutorials Point \r\n";
   println!("Before trim ");
   println!("length is {}",fullname.len());
   println!();
   println!("After trim ");
   println!("length is {}",fullname.trim().len());
}

输出

上述程序生成以下输出 -

Before trim
length is 24

After trim
length is 15

插图:split_whitespace()

split_whitespace ()将输入字符串拆分为不同的字符串。它返回一个迭代器,因此我们迭代令牌,如下所示 -

fn main(){
   let msg = "Tutorials Point has good t
   utorials".to_string();
   let mut i = 1;
   
   for token in msg.split_whitespace(){
      println!("token {} {}",i,token);
      i+=1;
   }
}

输出

token 1 Tutorials
token 2 Point
token 3 has
token 4 good
token 5 tutorials

插图:split()字符串

split () 字符串方法返回字符串切片子字符串的迭代器,子字符串由模式匹配的字符分隔。split()方法的限制是不能存储结果以供以后使用。collect方法可用于将 split() 返回的结果存储为向量。

fn main() {
   let fullname = "Kannan,Sudhakaran,Tutorialspoint";

   for token in fullname.split(","){
      println!("token is {}",token);
   }

   //store in a Vector
   println!("\n");
   let tokens:Vec<&str>= fullname.split(",").collect();
   println!("firstName is {}",tokens[0]);
   println!("lastname is {}",tokens[1]);
   println!("company is {}",tokens[2]);
}

上面的示例在遇到逗号(,)时分割字符串fullname

输出

token is Kannan
token is Sudhakaran
token is Tutorialspoint

firstName is Kannan
lastname is Sudhakaran
company is Tutorialspoint

插图:chars()

可以使用 chars 方法访问字符串中的各个字符。让我们考虑一个例子来理解这一点。

fn main(){
   let n1 = "Tutorials".to_string();

   for n in n1.chars(){
      println!("{}",n);
   }
}

输出

T
u
t
o
r
i
a
l
s

使用 + 运算符连接字符串

一个字符串值可以附加到另一个字符串上。这称为串联或插值。字符串连接的结果是一个新的字符串对象。+ 运算符内部使用add方法。add 函数的语法有两个参数。第一个参数是self - 字符串对象本身,第二个参数是第二个字符串对象的引用。如下所示 -

//add function
add(self,&str)->String { 
   // returns a String object
}

插图:字符串连接

fn main(){
   let n1 = "Tutorials".to_string();
   let n2 = "Point".to_string();

   let n3 = n1 + &n2; // n2 reference is passed
   println!("{}",n3);
}

输出如下所示

TutorialsPoint

插图:类型转换

以下示例说明将数字转换为字符串对象 -

fn main(){
   let number = 2020;
   let number_as_string = number.to_string(); 
   
   // convert number to string
   println!("{}",number_as_string);
   println!("{}",number_as_string=="2020");
}

输出如下所示

2020
true

插图:格式!宏

将 String 对象添加到一起的另一种方法是使用称为 format 的宏函数。使用格式!如下图所示。

fn main(){
   let n1 = "Tutorials".to_string();
   let n2 = "Point".to_string();
   let n3 = format!("{} {}",n1,n2);
   println!("{}",n3);
}

输出如下所示

Tutorials Point