Rust 字符串
Rust中的String数据类型可以分为以下几种−
- 字符串字面量 ( &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
字符串对象
字符串对象类型是在标准库中提供的。与字符串字面值不同,字符串对象类型不是核心语言的一部分。它在标准库中定义为公共结构体pub struct String。字符串是可增长的集合。它是可变且以UTF-8编码的类型。字符串对象类型可以用于表示在运行时提供的字符串值。字符串对象在堆中分配。
语法
要创建一个字符串对象,可以使用以下任一语法−
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> ,其中P是可以是&str、char或确定拆分方式的闭包。 | 返回此字符串片段的子字符串的迭代器,由模式匹配的字符分隔。 |
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()函数接受两个参数-第一个参数是要搜索的字符串模式,第二个参数是要替换的新值。在上面的示例中,name1字符串中出现了两次Hello。
replace函数将字符串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() 将输入字符串分割成不同的字符串。它返回一个迭代器,因此我们可以按照下面的方式迭代tokens –
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的宏函数。Format!的使用如下所示。
fn main(){
let n1 = "Tutorials".to_string();
let n2 = "Point".to_string();
let n3 = format!("{} {}",n1,n2);
println!("{}",n3);
}
输出将如下所示
Tutorials Point