Rust 中 String 与 &str 的转换与应用

187 阅读2分钟

1. String 和 &str 转换

1.1 - &str/String + &str/String -> String

let s1 = "0"; 
let s2 = "1"; 
let s = format!("{}{}", s1, s2); // s:String

let s1 = "0";
let s2 = "1".to_string();
let s = format!("{}{}", s1, s2);  // s:String

1.2 - String -> &str

let s: String = String::from("Hello");
let s_ref: &str = &s;

let s: String = String::from("Hello");
let s_ref: &str = s.as_str();

1.3 - String -> &str/&[u8]/&vec[u8](unsafe)

// &str
let s: String = String::from("Hello");
let s_ref: &str = &s;

let s: String = String::from("Hello");
let s_ref: &str = s.as_str();

// &[u8]
let s: String = String::from("Hello");
let bytes = s.as_bytes();

// &vec[u8]
unsafe {
    let mut s: String = String::from("Hello");
    let vec_bytes: &mut Vec<u8> = s.as_mut_vec();
}

1.4 &str/&[u8]/&vec[u8](unsafe) -> String

// &str
let s = "Hello";
let s_string = s.to_string();
let s_string = s.to_owned();

// &[u8]
let s: &[u8] = &[];
let s_string: String = String::from_utf8(s.to_vec()).unwrap();

// &vec[u8]
let s: Vec<u8> = vec![];
let s_string = String::from_utf8(s).unwrap();

2. 字符串的常用方法

// 1. `len()` 方法可以返回字符串的长度(以字节为单位)
let s = "Hello, world!";
let length = s.len(); // length = 13

// 2. 子串获取: `get()` 和 `get_mut()` 方法可以安全地获取字符串的子串。
//  注意:返回类型是 Option<T> 
let s = "Hello, world!";
let substring: Option<&str> = s.get(7..12); // 获取子串 "world"

// 3. 字符串替换: `replace()` 方法可以替换字符串中的某些部分。
let s: &str = "I like Rust. Rust is great.";
let new_s: String = s.replace("Rust", "Python");

// 4. 字符串分割: `split()` 方法可以根据指定的分隔符将字符串分割成多个子串。
let s: &str = "apple,banana,cherry";
let fruits: Vec<&str> = s.split(",").collect();

// 5.  前缀/后缀检查: `starts_with()` 和 `ends_with()` 方法可以检查字符串是否以指定的前缀或后缀开始/结束。
let s: &str = "Hello, world!";
let starts_with_h: bool = s.starts_with("Hello"); // true
let ends_with_bang: bool = s.ends_with("!"); // true

// 7.  大小写转换: `to_uppercase()` 和 `to_lowercase()` 方法可以将字符串转换为大写或小写。
let s: &str = "Hello, World!";
let uppercase: String = s.to_uppercase(); // "HELLO, WORLD!"
let lowercase: String = s.to_lowercase(); // "hello, world!"

// 8.  修剪空白: `trim()`, `trim_start()` 和 `trim_end()` 方法可以修剪字符串两端或单侧的空白字符。
let s: &str = "   Hello, world!   ";
let trimmed: &str = s.trim(); // "Hello, world!"

// 9.  字符串搜索: `find()` 方法可以在字符串中搜索指定的子串,返回找到的第一个位置的索引。
//  注意:返回类型是 Option<T> 
let s: &str = "Hello, world!";
let index: Option<usize> = s.find(","); // index = 5

3. 遍历字符串

// 1. chars() 方法可以确保我们正确地遍历 UTF-8 编码的字符串,即使字符串包含多字节字符。
let s = "Hello, 世界!"; 
for c in s.chars() { println!("{}", c); }

// 2. bytes()` 方法返回一个迭代器,该迭代器逐个产生字符串中的字节。这种方法适用于需要访问原始字节的情况。
let s = "Hello, 世界!"; 
for byte in s.bytes() { println!("{}", byte); }

// 3. char_indices() 遍历字符及其索引
let my_string = String::from("Hello, world!");
for (index, ch) in my_string.char_indices() {
    println!("Index: {}, Character: {}", index, ch);
}

// 4. split() 方法返回一个迭代器,其中包含根据指定分隔符分割的子串。
let s = "hello,world,rust";
for part in s.split(',') {
    println!("{}", part);
}

// 5. lines() 方法,它用于按行遍历字符串,每行被认为是一个子串,返回一个迭代器
let s = r#" 
<div> 
   <p>Hello, world!</p>
</div> 
"#;
for line in s.lines() { 
    println!("{}", line); 
}