Archive/Rust

[Rustlings] 6. struct

Rust에는 struct의 종류는 세가지 있다. C 스타일의 struct과 Tuple 스타일의 struct, Unit 스타일의 struct을 사용할 수 있다.

C 스타일의 struct는 C언어에서 본 방식과 비슷하다. 각 요소마다 이름과 타입을 지정하는 방식이다.

struct Color {
  name: String,
  code: String,
}

fn main() {
  let green = Color {
    name: String::from("green"),
    code: String::from("#00ff00"),
  };

  println!("{} {}", green.name, green.code);
}

Tuple 스타일의 struct는 Tuple처럼 요소에 이름을 붙이지 않는다.

struct Color(String, String)

fn main() {
  let green = Color(
    String::from("green"),
    String::from("#00ff00"),
  );

  println!("{} {}", green.0, green.1);
}

Unit 스타일의 struct는 요소가 없는 struct다. 보통 단일 타입을 지정할 때 사용한다.

struct None

fn main() {
  let something = None {};
}

Rust는 따로 클래스 지정이 없지만 struct에 method를 지정하는 방식으로 struct를 클래스처럼 사용할 수 있다. lvalue는 &self 파라미터를 통해 레퍼런스를 받는다. 만약 lvalue의 변경이 필요하다면 &mut self로 바꾸면 된다.

struct Color {
  r: i32,
  g: i32,
  b: i32
}

impl Color {
  fn mix(&mut self, other: &Color) {
    self.r = (self.r + other.r) / 2;
    self.g = (self.g + other.g) / 2;
    self.b = (self.b + other.b) / 2;
  }
  
  fn to_hex(&self) -> String {
    String::from(format!("#{:02x}{:02x}{:02x}", self.r, self.g, self.b))
  }
}

fn main() {
  let mut color1 = Color { r: 0x00, g: 0xff, b: 0x00 };
  let color2 = Color { r: 0xff, g: 0x00, b: 0x00 };
  
  color1.mix(&color2);
  println!("{}", color1.to_hex());
}

'Archive > Rust' 카테고리의 다른 글

[Rustlings] 8. module  (0) 2021.05.22
[Rustlings] 7. enum  (0) 2021.05.21
[Rustlings] 5. Primitive Types  (0) 2021.05.15
[Rustlings] 4. Move Semantics  (0) 2021.05.14
[Rustlings] 3. if  (0) 2021.05.12