字符串
Rust中的字符串数据类型可以分为以下几种 −
字符串文字(&str)
字符串对象(String)
字符串文字
当字符串的值在编译时已知时,使用字符串文字 (&str)。 字符串文字是一组字符,它们被硬编码到变量中。 例如,let company="Tutorials Point"。 字符串文字可在模块 std::str 中找到。 字符串文字也称为字符串切片。
以下示例声明两个字符串文字 − company 和 location。
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 | new() | pub const fn new() → String | 创建一个新的空字符串。 |
| 2 | to_string() | fn to_string(&self) → 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) | 将给定的字符附加到该字符串的末尾。 |
| 6 | push_str() | pub fn push_str(&mut self, string: &str) | 将给定的字符串切片附加到该字符串的末尾。 |
| 7 | len() | pub fn len(&self) → usize | 返回此字符串的长度(以字节为单位)。 |
| 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 TutorialsPoint ,
Hello!".to_string();
println!("{}",name1);
}
输出
上面的程序生成以下输出 −
Hello TutorialsPoint , Hello!
示例:replace()
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()
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() string 方法返回字符串切片子字符串的迭代器,子字符串由模式匹配的字符分隔。 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 函数
add(self,&str)->String {
// 返回一个字符串对象
}
示例:字符串连接
fn main(){
let n1 = "Tutorials".to_string();
let n2 = "Point".to_string();
let n3 = n1 + &n2; // n2 引用已传递
println!("{}",n3);
}
输出如下所示
TutorialsPoint
示例:类型转换
以下示例说明将数字转换为字符串对象 −
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);
}
输出如下所示
Tutorials Point