Rust 第五节 - 结构体

63 阅读2分钟

5 结构体

5.1 声明一个结构体

在rust中,当我们需要声明一个结构体,需要在使用struct这个关键字,例如:

struct User {
    name: String,
    age: i8,
    height: i8,
}
let user = User {
    name: String::from("stephen"),
    age: 18,
    height: 176,
};

结构体还可以这样来简化一个初始化的传参,例如:

fn build_user(name: String, age: i8) -> User {
    User { name, age, height: 176 }
}

当我们想接受另外一个实例的数据,如果我们一个一个传进去,参数多了就会非常麻烦,我们可以使用..来将重复的参数传入进去,例如:

#[derive(Debug)]
struct User {
    name: String,
    age: i8,
    height: i32,
}
let user = User {
    name: String::from("stephen"),
    age: 18,
    height: 176,
};

let user1 = User {
    name: String::from("james"),
    ..user
};

5.2 打印结构体

当我们要打印一个结构体实例的时候,如果使用println("{}", user1)是完全不够的,因为打印结构体是需要实现Display特征的,但是我们可以直接使用下面的方法来打印,例如:

println!("{:?}", user1); // 不会格式化
println!("{:#?}", user1) // 会格式化

5.3 元祖结构体

我们还可以定义一种特殊的结构体,叫做元祖结构体,例如:

struct Position(i16, i16, i16);
let pos = Position(1, 1, 1);
println!("{}", pos.0)

我们可以直接和元祖一样去结构,或者使用索引pos.0去访问具体的值。

5.3 空结构体

当我们需要为一个结构体加上特征trait时,并且不需要存储任何的数据时,这时候我们可以声明一个空结构体,例如:

struct User;

5.4 方法

我们可以为结构体声明方法,这个方法的第一个参数,永远返回的地是结构体的实例,例如:

#[derive(Debug)]
struct User {
    name: String,
    age: i8,
    height: i32,
}
impl User {
    fn is_adult(&self) -> bool { // 为User定义一个判断是否是成人的方法
        self.age >= 18
    }
}
let user = User {
    name: String::from("stephen"),
    age: 18,
    height: 176,
};
println!("{:#?}", user.is_adult())

我们也可以给方法传入更多的参数,例如:

impl User {
    fn compare_age(&self, other: &User) -> bool {
        // 为User定义一个判断是否是成人的方法
        self.age >= other.age
    }
}
let user = User {
    name: String::from("james"),
    age: 17,
    height: 203,
};
let user1 = User {
    name: String::from("stephen"),
    age: 18,
    height: 176,
};
println!("我的年纪更大:{}", user1.compare_age(&user))

5.5 关联函数

我们也可以声明一个类似于String::from的一个关联函数,我们的参数可以自定义,例如:

impl User {
    fn relative_fn(name: String, age: i8) -> User {
        User {
            name,
            age,
            height: 176,
        }
    }
}

let user = User::relative_fn(String::from("stephen"), 18);
println!("{:#?}", user)