【转】rust中impl关键字的用法(二)—What is the Impl keyword in Rust?([transfer] usage of impl keyword in trust (II) — 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  keyword follow the  keyword before the type name. Let’s implement an built-in trait called  on a  struct:

for
impl
ToString
Dog
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  trait on a  struct using the  keyword:

Details
Movie
trait
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

————————

 原文: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  keyword follow the  keyword before the type name. Let’s implement an built-in trait called  on a  struct:

for
impl
ToString
Dog
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  trait on a  struct using the  keyword:

Details
Movie
trait
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