📅  最后修改于: 2020-11-02 04:13:53             🧑  作者: Mango
Rust中的String数据类型可以分为以下几种-
字符串字面量(&str)
字符串对象(字符串)
当在编译时知道字符串的值时,将使用字符串字面量(&str)。字符串字面量是一组字符,这些字符被硬编码为变量。例如,让company =“ Tutorials Point” 。字符串字面量可在模块std :: str中找到。字符串字面量也称为字符串切片。
下面的例子声明了两个字符串字面量-公司和位置。
fn main() {
let company:&str="TutorialsPoint";
let location:&str = "Hyderabad";
println!("company is : {} location :{}",company,location);
}
默认情况下,字符串字面量是静态的。这意味着可以保证字符串字面量在整个程序期间均有效。我们还可以将变量明确指定为static,如下所示-
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中定义为公共结构。字符串是可增长的集合。它是可变的且采用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("TutorialsPoint");
println!("length is {}",content_string.len());
}
上面的示例创建两个字符串-使用new方法的空字符串对象和使用from方法的字符串字面量的字符串对象。
输出如下所示-
length is 0
length is 14
Sr.No. | Method | Signature | Description |
---|---|---|---|
1 | new() | pub const fn new() → String | Creates a new empty String. |
2 | to_string() | fn to_string(&self) → String | Converts the given value to a String. |
3 | replace() | pub fn replace<‘a, P>(&’a self, from: P, to: &str) → String | Replaces all matches of a pattern with another string. |
4 | as_str() | pub fn as_str(&self) → &str | Extracts a string slice containing the entire string. |
5 | push() | pub fn push(&mut self, ch: char) | Appends the given char to the end of this String. |
6 | push_str() | pub fn push_str(&mut self, string: &str) | Appends a given string slice onto the end of this String. |
7 | len() | pub fn len(&self) → usize | Returns the length of this String, in bytes. |
8 | trim() | pub fn trim(&self) → &str | Returns a string slice with leading and trailing whitespace removed. |
9 | split_whitespace() | pub fn split_whitespace(&self) → SplitWhitespace | Splits a string slice by whitespace and returns an iterator. |
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. | Returns an iterator over substrings of this string slice, separated by characters matched by a pattern. |
11 | chars() | pub fn chars(&self) → Chars | Returns an iterator over the chars of a string slice. |
使用new()方法创建一个空字符串对象,并将其值设置为hello 。
fn main(){
let mut z = String::new();
z.push_str("hello");
println!("{}",z);
}
上面的程序生成以下输出-
hello
要访问String对象的所有方法,请使用to_string()函数将字符串字面量转换为对象类型。
fn main(){
let name1 = "Hello TutorialsPoint ,
Hello!".to_string();
println!("{}",name1);
}
上面的程序生成以下输出-
Hello TutorialsPoint , Hello!
replace()函数有两个参数-第一个参数是要搜索的字符串模式,第二个参数是要替换的新值。在上面的示例中, Hello在name1 字符串出现两次。
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()函数提取包含整个字符串的字符串切片。
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()函数将给定的char附加到此String的末尾。
fn main(){
let mut company = "Tutorial".to_string();
company.push('s');
println!("{}",company);
}
上面的程序生成以下输出-
Tutorials
push_str()函数将给定的字符串切片追加到String的末尾。
fn main(){
let mut company = "Tutorials".to_string();
company.push_str(" Point");
println!("{}",company);
}
上面的程序生成以下输出-
Tutorials Point
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()将输入字符串拆分为不同的字符串。它返回一个迭代器,因此我们要遍历令牌,如下所示:
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()方法的局限性在于无法存储结果供以后使用。 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= fullname.split(",").collect();
println!("firstName is {}",tokens[0]);
println!("lastname is {}",tokens[1]);
println!("company is {}",tokens[2]);
}
上面的示例在遇到逗号(,)时拆分字符串全名。
token is Kannan
token is Sudhakaran
token is Tutorialspoint
firstName is Kannan
lastname is Sudhakaran
company is Tutorialspoint
在一个字符串的各个字符可以使用字符方法来访问。让我们考虑一个例子来理解这一点。
fn main(){
let n1 = "Tutorials".to_string();
for n in n1.chars(){
println!("{}",n);
}
}
T
u
t
o
r
i
a
l
s
字符串值可以附加到另一个字符串。这称为串联或插值。字符串串联的结果是一个新的字符串对象。 +运算符在内部使用加法。 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