[rust]String

58 阅读1分钟

创建String

fn main() {
   // 创建一个空字符串
   let mut s = String::new();
   s.push_str("rust");
   println!("{}", s);

   // 创建带初始值的字符串
   let mut s = String::from("rust");
   println!("{}", s);

   // 根据字面量创建字符串
   let mut s = "rust".to_string();
   println!("{}", s);
}

更新String

fn main() {
    let mut s1 = String::new();

    // append一个字符串
    s1.push_str("tea");
    // append一个字符
    s1.push('m');
    println!("s1 = {}",s1);

    // 字符串拼接
    let mut s2 = String::from(" member");
    let s3 = s1 + &s2; // s1的所有权转移给了s3,s1不能再使用
    println!("s3 = {}",s3);

    // 格式化字符串
    let s1 = "hello".to_string();
    let s2 = ",world".to_string();
    let s3 = format!("{},{}",s1,s2);
    println!("s3 = {}",s3);
}

字符串索引

字符串不支持直接通过索引小标的方式获取字符,我们可以通过slice的方式获取,或者通过for循环遍历

fn main() {
   let s = String::from("hello");
    // 通过slice的方式访问其中某个字符
    let sub_s = &s[0..=0];
    println!("sub: {}",sub_s); // h

    // 遍历每一个字符
    for char in s.chars() {
        println!("当前字符: {}",char);
    }

    // 遍历每一个字节
    for byte in s.bytes(){
        println!("当前字节: {}",byte);
    }
}

如果字符串中有汉字,使用slice的方式获取需要注意,一个汉字占三个字节,所以第一个汉字的有效范围是 [0,3),第二个汉字的有效范围是[3,6),对此Rust官方不建议使用此种方式去获取其中某个字符。我们可以通过for循环遍历加字符串实例自身的chars()方法去确保我们获取到是预期的数据。

fn main() {
    // *********特殊情况*********
    let s = String::from("你好");
    let sub_s = &s[0..=2]; // 你
    println!("sub: {}",sub_s);
    let sub_s = &s[3..=5]; // 好
    println!("sub: {}",sub_s);

    // 遍历每一个字符
    for char in s.chars() {
        println!("当前字符: {}",char);
    }
}