Rust String 类型怎么用?字符串操作有哪些常见方法?

文章导读
上一个 测验 下一个 Rust 中的 String 数据类型可以分为以下几类 −
📋 目录
  1. A 字符串字面量
  2. B 字符串对象
  3. C 示例:new()
  4. D 示例:to_string()
  5. E 示例:replace()
  6. F 示例:as_str()
  7. G 示例:push()
  8. H 示例:push_str()
  9. I 示例:len()
  10. J 示例:trim()
A A

Rust - 字符串



上一个
测验
下一个

Rust 中的 String 数据类型可以分为以下几类 −

  • 字符串字面量(&str)

  • 字符串对象(String)

字符串字面量

字符串字面量 (&str) 用于在编译时已知字符串值的情况。字符串字面量是一组硬编码到变量中的字符。例如,let company=""。字符串字面量位于模块 std::str 中。字符串字面量也被称为字符串切片。

以下示例声明了两个字符串字面量 − companylocation

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

字符串字面量默认是静态的。这意味着字符串字面量在整个程序运行期间保证有效。我们也可以显式地将变量指定为静态,如以下所示 −

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

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

company is :  location :Hyderabad

字符串对象

String 对象类型由标准库提供。与字符串字面量不同,字符串对象类型不是核心语言的一部分。它在标准库中定义为公共结构体 pub struct StringString 是一个可增长的集合。它是可变的且采用 UTF-8 编码的类型。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("");
   println!("length is {}",content_string.len());
}

上述示例使用 new 方法创建了一个空字符串对象,并使用 from 方法从字符串字面量创建了一个字符串对象。

输出如下所示 −

length is 0
length is 14

常用方法 - 字符串对象

序号 方法 签名 描述
1 new() pub const fn new() → String 创建一个新的空 String
2 to_string() fn to_string(&self) → String 将给定的值转换为 String
3 replace() pub fn replace<'a, P>(&'a self, from: P, to: &str) → String 用另一个字符串替换所有匹配的模式。
4 as_str() pub fn as_str(&self) → &str 提取包含整个字符串的字符串切片。
5 push() pub fn push(&mut self, ch: char) 将给定的字符追加到此 String 的末尾。
6 push_str() pub fn push_str(&mut self, string: &str) 将给定的字符串切片追加到此 String 的末尾。
7 len() pub fn len(&self) → usize 返回此 String 的长度(以字节为单位)。
8 trim() pub fn trim(&self) → &str 返回去除首尾空白字符的字符串切片。
9 split_whitespace() pub fn split_whitespace(&self) → SplitWhitespace 按空白字符分割字符串切片并返回迭代器。
10 split() pub fn split<'a, P>(&'a self, pat: P) → Split<'a, P> , where P is pattern can be &str, char, or a closure that determines the split. 返回此字符串切片按模式匹配字符分隔的子字符串迭代器。
11 chars() pub fn chars(&self) → Chars 返回字符串切片的字符迭代器。

示例: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  , 
   Hello!".to_string();
   println!("{}",name1);
}

输出

上述程序生成以下输出 −

Hello  , Hello!

示例:replace()

replace() 函数接受两个参数 − 第一个参数是要搜索的字符串模式,第二个参数是要替换的新值。在上面的示例中,Helloname1 字符串中出现了两次。

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

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

输出

上述程序生成以下输出 −

Howdy  , 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() 函数将给定的 char 追加到此 String 的末尾。

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

输出

上述程序生成以下输出 −

Tutorials

示例:push_str()

push_str() 函数将给定的字符串切片追加到 String 的末尾。

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

输出

上述程序生成以下输出 −


示例:len()

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

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

输出

上述程序生成以下输出 −

length is 20

示例:trim()

trim() 函数移除字符串首尾的空格。注意,该函数不会移除内联空格。

fn main() {
   let fullname = "  \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() 将输入字符串拆分为不同的字符串。它返回一个迭代器,因此我们如下面所示遍历这些 token −

fn main(){
   let msg = " 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() 字符串 方法返回一个字符串切片的子字符串迭代器,这些子字符串由匹配 pattern 的字符分隔。split() 方法的限制是其结果无法存储以供后续使用。collect 方法可用于将 split() 返回的结果存储为一个 vector。

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

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

   //存储到一个 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 

firstName is Kannan
lastname is Sudhakaran
company is 

示例: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 函数
add(self,&str)->String { 
   // 返回一个 String 对象
}

示例:字符串连接

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

   let n3 = n1 + &n2; // 传递 n2 的引用
   println!("{}",n3);
}

输出将如下所示


示例:类型转换

以下示例演示了将数字转换为字符串对象 −

fn main(){
   let number = 2020;
   let number_as_string = number.to_string(); 
   
   // 将数字转换为字符串
   println!("{}",number_as_string);
   println!("{}",number_as_string=="2020");
}

输出将如下所示

2020
true

示例:Format! 宏

将两个 String 对象连接在一起的另一种方式是使用名为 format 的宏函数。Format! 的用法如下所示。

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

输出将如下所示