zoukankan      html  css  js  c++  java
  • 【转】rust中impl关键字的用法(二)What is the Impl keyword in Rust?

     原文:https://www.educative.io/edpresso/what-are-traits-in-rust

    -------------------------------------------

    A trait in Rust is a group of methods that are defined for a particular type. Traits are an abstract definition of shared behavior amongst different types. So, in a way, traits are to Rust what interfaces are to Java or abstract classes are to C++. A trait method is able to access other methods within that trait.

    Implementing a trait

    A trait is implemented similarly to an inherent implementation except that a trait name and the for keyword follow the impl keyword before the type name. Let’s implement an built-in trait called ToString on a Dog struct:

    struct Dog {
      name: String,
      age: u32, 
      owner: String
    }
    
    
    // Implementing an in-built trait ToString on the Dog struct
    impl ToString for Dog {
      fn to_string(&self) -> String{
        return format!("{} is a {} year old dog who belongs to {}.", self.name, self.age, self.owner);
      }
    }
    
    fn main() {
      let dog = Dog{name: "Frodo".to_string(), age: 3, owner: "Maryam".to_string()};
      println!("{}", dog.to_string());
    }
    

      

    Defining a trait

    Now that we know how to implement traits, we can get to defining traits ourselves. In the following program, we will define a Details trait on a Movie struct using the trait keyword:

    struct Movie {
        title: String,
        director: String,
        release_year: u32, 
        genre: String
    }
    
    // Defining a Details trait by defining the functionality it should include
    trait Details {
        fn description(&self) -> String;
        fn years_since_release(&self) -> u32;
    }
    
    // Implementing the Details trait on Movie struct
    impl Details for Movie{
    
      // Method returns an overview of the movie
      fn description(&self) -> String{
        return format!("{}, released in {}, is a {} movie directed by {}.", self.title, self.release_year, self.genre, self.director);
      }
    
      // Method returns the number of years between the writing year of this shot i.e.
      // 2020 and the release year of the movie
      fn years_since_release(&self) -> u32{
        return 2020 - self.release_year;
      }
    }
    
    fn main() {
      let movie1 = Movie{
          title: "Titanic".to_string(),
          director: "James Cameron".to_string(),
          release_year: 1997,
          genre: "historical".to_string()
      };
      println!("{}", movie1.description());
      println!("The movie was released {} years ago.", movie1.years_since_release());
    
      let movie2 = Movie{
          title: "The Dark Knight".to_string(),
          director: "Christopher Nolan".to_string(),
          release_year: 2008,
          genre: "action".to_string()
      };
      println!("\n{}", movie2.description());
      println!("The movie was released {} years ago.", movie2.years_since_release());
    }
    

      

    CREATOR

    Anusheh Zohair Mustafeez
  • 相关阅读:
    500 cannot be cast to javax.xml.registry.infomodel
    mybatis
    [Nest] 02.nest之控制器
    [React] react-interview-01
    [JavaScript] es6规则总结
    [JavaScript] Date对象
    [Vue] vuex-interview
    [Vue] vue-router-interview
    [Vue] vue的一些面试题4
    [Vue] vue的一些面试题3
  • 原文地址:https://www.cnblogs.com/oxspirt/p/15600866.html
Copyright © 2011-2022 走看看