「Rust」3 字符串、切片与元组

字符串

切片(Slice)

let s = String::from("hello,world");
let hello = &s[0..5];
let world = &s[6..11];

和 Go 一样,引用String 的一部分内容,存储一个ptr 和一个len

字符串切片时,索引必须落在字符的边界

切片作为对集合的部分引用,数组等类型也有相应的切片

字符串字面量是切片

let s: &str = "Hello, world!";//不可变引用

什么是字符串

字符是Unicode类型,每个字符四个字节;字符串是UTF-8 编码,么个字符的字节数是变化的。

字符串通常指的是 String 类型和&str 字符串切片类型,都是UTF8编码。

操作字符串

fn main(){
    let mut s = String::new();//创建空String
    s.push_str("hello");//添加&str类型的字符串
    s.push("!");//添加字符

    let mut s = "hello".to_string();//从现有的切片创建
    s.push("!");

    let mut s = String::from("hello!");

    let s1 = String::from("hello,");
    let s2 = String::from("world!");
    let s3 = s1 + &s2;//这里s1的所有权转移了
}

上面的字符串相加使用add 方法,

fn add(self, s: &str) -> String{}

相当于String = String + &str + &str + ...

String 和 &str 的转换

String -> &str

deref 隐式强制转换

fn main(){
    let s = String::from("hello, world!");
    say(&s);
    say(&s[..]);
    say(s.as_str());
}
fn say(s: &str){
    println!("{}", s);
}

字符串索引

由于UTF8,原生只支持使用charsbytes 方法返回迭代器

for c in "你好".chars(){
    println!("{}", c);
}
for b in "你好".bytes(){
    println!("{}", b);
}

获取子串可以考虑尝试下这个库:utf8_slice

元组

元组组合起了多种类型,它的长度和元素的顺序是固定的。

fn main(){
    let tup:(i32, f64, u8)=(500,6.4,1)
}
  • 可以使用模式匹配解构元组
let (x,y,z) = tup;
  • 可以使用.来访问元组,索引从0开始

结构体

定义

struct User {
    active: bool,
    username: String,
    email: String,
    sign_in_count: u64,
}

创建结构体实例时,每个字段都需要初始化

顺序则不重要

使用.操作符来访问字段

简化结构体创建

fn build_user(email: String,username:String) -> User {
    User {
        email,
        username,
        active: true,
        sign_in_count: 1,
    }
}

结构体更新

fn main() {
  let user2 = User {
        email: String::from("[email protected]"),
        ..user1
    };
}

这里user1的部分复杂字段发生了所有权转移

元组结构体

和元组很像的结构体

struct Point(i32,i32,i32)
#rust #笔记
0%