강좌11-구조체의 확장: Implement
구조체에 implement를 적용하면 함수를 추가할 수 있습니다.
이는 마치 Class 구조와 비슷하게 동작하는 효과를 주므로 매우 유용하게 사용할 수 있습니다.
struct User {
first: String,
last: String,
age: u32
}
impl User {
fn full_name (&self) -> String {
format!("{} {}", self.first, self.last)
}
}
사용 방법은 반드시 구조체가 구성되어 있어야 하며,
함수마다 첫번째 인자로 &self를 반드시 가져야 합니다.
활용
impl은 여러개의 함수를 포함할 수 있으나,
여러번 나누어 선언해도 됩니다.
impl User {
fn full_name (&self) -> String {
format!("{} {}", self.first, self.last)
}
fn all(&self) -> String {
format!("{} {} {}", self.first, self.last, self.age)
}
}
// 또는
impl User {
fn full_name (&self) -> String {
format!("{} {}", self.first, self.last)
}
}
impl User {
fn all(&self) -> String {
format!("{} {} {}", self.first, self.last, self.age)
}
}
중복 불가
당연할 수 있겠으나 어느 상황에도 같은 함수를 중복해서 사용할 수는 없습니다.
impl User {
fn full_name (&self) -> String {
format!("{} {}", self.first, self.last)
}
}
impl User {
fn full_name (&self) -> String {
format!("{} {}", self.last, self.first)
}
}
//결과
|
8 | / fn full_name (&self) -> String {
9 | | format!("{} {}", self.first, self.last)
10 | | }
| |___^ duplicate definitions for `full_name`
...
14 | / fn full_name (&self, n: i32) -> String {
15 | | format!("{} {}", self.last, self.first)
16 | | }
| |___- other definition for `full_name`
함수명의 중복을 체크하기 때문에 파라미터의 확장 역시 불가합니다.
impl User {
fn full_name (&self) -> String {
format!("{} {}", self.first, self.last)
}
}
impl User {
fn full_name (&self, n: i32) -> String {
format!("{} {}", self.last, self.first)
}
}
//결과
|
8 | / fn full_name (&self) -> String {
9 | | format!("{} {}", self.first, self.last)
10 | | }
| |___^ duplicate definitions for `full_name`
...
14 | / fn full_name (&self, n: i32) -> String {
15 | | format!("{} {}", self.last, self.first)
16 | | }
| |___- other definition for `full_name`
추가 인자
&self 외의 인자를 받을 수 있습니다.
추가 인자가 있는 함수에 값을 전달하려면 일반 함수를 호출하듯 호출하면 됩니다.
즉, &self를 무시하면 일반 함수를 호출하는 것과 동일합니다.
impl User {
fn is_older (&self, age:u32) -> String {
self.age > age
}
}
fn main() {
println!("{}", is_older(20))
}
댓글남기기