Structure 같은경우에 말 그대로 C++의 구조체와 비슷하다.
struct User {
active: bool,
username: String,
email: String,
sign_in_count: u64,
}
fn main() {
let user1 = User {
active: true,
username: String::from("someusername123"),
email: String::from("someone@example.com"),
sign_in_count: 1,
};
}
이런식으로 이름없이 사용도 가능하다. 사용은 Color.0, Color.1 이런식으로 쓸수 있다.
struct Color(i32, i32, i32);
struct Point(i32, i32, i32);
fn main() {
let black = Color(0, 0, 0);
let origin = Point(0, 0, 0);
}
구조체 에서 사용하는 함수를 impl을이용해서 표현할 수 있다.
예시를 보면 파이썬에서 함수에서 자기자신을 불러오는 방식과 비슷해 보인다.
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn area(&self) -> u32 {
self.width * self.height
}
}
fn main() {
let rect1 = Rectangle {
width: 30,
height: 50,
};
println!(
"The area of the rectangle is {} square pixels.",
rect1.area()
);
}
C, C++에서 사용하는 -> 를 생각해보자. 위와 같은 상황에서는 self->width가 더 맞는 표현 같다. 하지만 러스트에서는 이 표현이 존재하지않는다. 이를 automatic referencing and dereferencing 이라고 부른다. 러스트는 자동적으로 &, *을 더한다. 따라서 아래의 두 코드는 같은 내용이다.
p1.distance(&p2);
(&p1).distance(&p2);
Enum형 같은경우에는 C, C++ 및 다른 언어에도 역시 존재한다. structure와 함께 사용한 예시 이다.
enum IpAddrKind {
V4,
V6,
}
struct IpAddr {
kind: IpAddrKind,
address: String,
}
let home = IpAddr {
kind: IpAddrKind::V4,
address: String::from("127.0.0.1"),
};
let loopback = IpAddr {
kind: IpAddrKind::V6,
address: String::from("::1"),
};
Enum에 있는 Option타입을 보자.
enum Option<T> {
None,
Some(T),
}
이는 열거형에 데이터가 있는 Some, 그리고 없는 None 두가지 형태로 나뉜다.
스프링에서 공부한 자바의 Optional과 비슷한 느낌이 나는 것 같다.
let x: i8 = 5;
let y: Option<i8> = Some(5);
let sum = x + y;
다음 코드는 오류를낸다. 오류내용은 i8과 Option<i8> 을 더할 수 없다는 내용이다. 그렇다고 x를 Option으로 바꿔도 해결되는가? 그것도 아니다.
fn main() {
let x: Option<i8> = Some(5);
let y: Option<i8> = Some(5);
let sum = match (x, y) {
(Some(a), Some(b)) => Some(a + b),
_ => None,
};
println!("{:?}", sum);
}
gpt한테 물어본결과 다음과 같이 변경해야한다고한다. Option은 데이터의 여부만 알려주는것 같다.
'휴지통 > 러스트' 카테고리의 다른 글
러스트 Ownership2 (0) | 2023.08.23 |
---|---|
러스트 Ownership1 (0) | 2023.08.22 |
러스트 기본프로그래밍 2 함수, 조건문, 반복문 (0) | 2023.08.17 |
러스트 기본프로그래밍 1 변수, 출력 (0) | 2023.08.17 |
러스트 hello world (0) | 2023.08.16 |