Skip to content

Structures: Method Syntax

Methods are smiilar to function. Unlike functions, methods are defined within the context of a structure(or an enum or a trait object).

A method(s) is defined using impl keyword.

Method's first parameter is always self, which represents the instance of the struct the method is being called on.

Using Method Syntax

struct Rect {
  height: i32,
  width: i32,
}

impl Rect {
  fn area(&self) -> i32 {
    self.width * self.height
  }
}

fn main() {
  let r1 = Rect {
    height: 4,
    width: 5,
  };

  println!("Area: {}", r1.area()); // 20
}

In above example, area() is a method of struct Rect. &self is refers to the struct where it is defined. &self is passed by reference because we don't need its ownership.

A method can accept multiple parameters. Following is an example:

struct Rect {
  height: i32,
  width: i32,
}

impl Rect {
  fn area(&self) -> i32 {
    self.width * self.height
  }

  fn can_hold(&self, r: &Rect) -> bool {
    self.width > r.width && self.height > r.height
  }
}

fn main() {
  let r1 = Rect {
    height: 4,
    width: 5,
  };

  let r2 = Rect {
    height: 2,
    width: 3,
  };

  println!("Area: {}", r1.area()); // 20
  println!("Can Hold r2: {}", r1.can_hold(&r2)); // true
}

Multiple impl block to a same struct can exist. Example:

struct Rect {
  height: i32,
  width: i32,
}

impl Rect {
  fn area(&self) -> i32 {
    self.width * self.height
  }
}

imple Rect {
  fn can_hold(&self, r: &Rect) -> bool {
    self.width > r.width && self.height > r.height
  }
}

Associated Functions

Associated functions are similar to methods, except that they won't have access to any instance of the struct they were defined in. This is because they don't accept a self parameter. String::from() is a associated function. Associated functions are called directly on the struct, unlike methods which are called upon instances.

They generally return a new instance of the struct they were defined in. For example:

struct Rect {
  height: i32,
  width: i32,
}

impl Rect {
  fn square(size: i32) -> Rect {
    Rect {
      height: size,
      width: size,
    }
  }
}