stucts
는 tuples
과 다르게 다양한 타입들을 조합할 수 있고, tuples
처럼 순서를 외울 필요가 없다. struct
를 선언하기 위해서 struct
키워드를 사용한다.
struct User {
active: bool,
username: String,
email: String,
sign_in_count: u64,
}
해당 구조체의 instance
를 사용하기 위해선, curly brackets
(중괄호)를 활용해 key: value 쌍을 추가해야 한다.
fn main() {
let user1 = User {
active: true,
username: String::from("someusername123"),
email: String::from("someone@example.com"),
sign_in_count: 1,
};
}
구조체의 특정 값을 가져오기 위해서는 dot notation을 써야 한다,
user1.email = String::from("anotheremail@example.com");
구조체의 instance는 mutable 해야 한다. Rust는 특정 부분만 mutable하게 두지 않는다. 아래 코드에서는 build_user
함수를 활용해 새로운 User
instance를 반환해준다.
fn build_user(email: String, username: String) -> User {
User {
email: email,
username: username,
active: true,
sign_in_count: 1,
}
}
parameter 와 field의 이름이 같은 경우 이를 축약할 수 있다.
fn build_user(email: String, username: String) -> User {
User {
email: email,
username: username,
active: true,
sign_in_count: 1,
}
}
새로운 struct의 instance를 만들 때, 다른 instance에 있는 값들을 그대로 사용할 수 있는 편한 문법이 있다. 아래 코드는 email과 username을 제외한 다른 값들은 모두 user1에서 가져온다는 뜻이다.
let user2 = User {
email: String::from("another@example.com"),
username: String::from("anotherusername567"),
..user1
};
Rust에서는 tuples
와 비슷한 tuple structs
를 지원해준다. tuple structs
를 정의하기 위해서 struct
키워드를 시작으로 tuple
내에 데이터 타입을 적어주면 된다. 모든 요소의 타입이 같아야만 하는 것은 아니다.
struct Color(i32, i32, i32);
struct Point(i32, i32, i32);
fn main() {
let black = Color(0, 0, 0);
let origin = Point(0, 0, 0);
}
filed가 없는 struct를 선언할 수 있다.이러한 구조체를 unit-list
struct라고 한다. 아직 필드를 어떻게 선언할 지 모르는 상황에서 유용하다. 일종의 추상화라고 생각하면 이해하기 쉽다.
struct AlwaysEqual;
fn main() {
let subject = AlwaysEqual;
}
위의 예시에서는 String
타입을 사용했다. struct에서 &str
과 같은 reference를 사용할 수 있지만, lifetimes의 사용을 전제로 한다. 구조체가 존재하는 동안 참조하는 데이터도 계속 존재할 수 있도록 하는 것이다. 만약 lifetime을 사용하지 않고 저장하고자 하면 compile error 가 난다.
struct User {
username: &str, // missing lifetime specifer
email: &str, // missing lifetime specifer
sign_in_count: u64,
active: bool,
}
fn main() {
let user1 = User {
email: "someone@example.com",
username: "someusername123",
active: true,
sign_in_count: 1,
};
}