实现结构体和枚举
在这里你可以开始赋予你的结构体和枚举一些真正的力量。要调用 struct
或 enum
上的函数,请使用 impl
块。这些函数被称为方法。impl
块中有两种方法。
- 方法:这些方法取self(或 &self 或 &mut self )。常规方法使用"."(一个句号)。
.clone()
是一个常规方法的例子。 - 关联函数(在某些语言中被称为 "静态 "方法):这些函数不使用self。关联的意思是 "与之相关"。它们的书写方式不同,使用
::
。String::from()
是一个关联函数,Vec::new()
也是。你看到的关联函数最常被用来创建新的变量。
在我们的例子中,我们将创建Animal并打印它们。
对于新的struct
或enum
,如果你想使用{:?}
来打印,你需要给它Debug,所以我们将这样做:如果你在结构体或枚举上面写了#[derive(Debug)]
,那么你就可以用{:?}
来打印。这些带有#[]
的信息被称为属性。你有时可以用它们来告诉编译器给你的结构体一个能力,比如Debug
。属性有很多,我们以后会学习它们。但是derive
可能是最常见的,你经常在结构体和枚举上面看到它。
#[derive(Debug)] struct Animal { age: u8, animal_type: AnimalType, } #[derive(Debug)] enum AnimalType { Cat, Dog, } impl Animal { fn new() -> Self { // Self means Animal. //You can also write Animal instead of Self Self { // When we write Animal::new(), we always get a cat that is 10 years old age: 10, animal_type: AnimalType::Cat, } } fn change_to_dog(&mut self) { // because we are inside Animal, &mut self means &mut Animal // use .change_to_dog() to change the cat to a dog // with &mut self we can change it println!("Changing animal to dog!"); self.animal_type = AnimalType::Dog; } fn change_to_cat(&mut self) { // use .change_to_cat() to change the dog to a cat // with &mut self we can change it println!("Changing animal to cat!"); self.animal_type = AnimalType::Cat; } fn check_type(&self) { // we want to read self match self.animal_type { AnimalType::Dog => println!("The animal is a dog"), AnimalType::Cat => println!("The animal is a cat"), } } } fn main() { let mut new_animal = Animal::new(); // Associated function to create a new animal // It is a cat, 10 years old new_animal.check_type(); new_animal.change_to_dog(); new_animal.check_type(); new_animal.change_to_cat(); new_animal.check_type(); }
这个打印:
The animal is a cat
Changing animal to dog!
The animal is a dog
Changing animal to cat!
The animal is a cat
记住,Self(类型Self)和self(变量self)是缩写。(缩写=简写方式)
所以,在我们的代码中,Self = Animal。另外,fn change_to_dog(&mut self)
的意思是fn change_to_dog(&mut Animal)
。
下面再举一个小例子。这次我们将在enum
上使用impl
。
enum Mood { Good, Bad, Sleepy, } impl Mood { fn check(&self) { match self { Mood::Good => println!("Feeling good!"), Mood::Bad => println!("Eh, not feeling so good"), Mood::Sleepy => println!("Need sleep NOW"), } } } fn main() { let my_mood = Mood::Sleepy; my_mood.check(); }
打印出Need sleep NOW
。