实现结构体和枚举

在这里你可以开始赋予你的结构体和枚举一些真正的力量。要调用 structenum 上的函数,请使用 impl 块。这些函数被称为方法impl块中有两种方法。

  • 方法:这些方法取self(或 &self&mut self )。常规方法使用"."(一个句号)。.clone()是一个常规方法的例子。
  • 关联函数(在某些语言中被称为 "静态 "方法):这些函数不使用self。关联的意思是 "与之相关"。它们的书写方式不同,使用::String::from()是一个关联函数,Vec::new()也是。你看到的关联函数最常被用来创建新的变量。

在我们的例子中,我们将创建Animal并打印它们。

对于新的structenum,如果你想使用{:?}来打印,你需要给它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