struct
나 function signature
들을 정의할 때 사용하므로써, 다양한 구체적인 데이터 유형에서 사용할 수 있게 한다. 구체화된 타입이나 다른 속성들에 대해 추상화할 수 있다. 제네릭 타입을 사용한다고 해서 runtime cost는 들지 않으므로, 부담없이 사용할 수 있다.
제네릭을 사용한 함수를 정의할 때, 일반적으로 매개 변수의 데이터 유형과 반환 값을 지정하는 부분에 제네릭을 배치한다.
fn largest<T>(list: &[T]) -> &T {
let mut largest = &list[0];
for item in list {
if item > largest {
largest = item;
}
}
largest
}
fn main() {
let number_list = vec![34, 50, 25, 100, 65];
let result = largest(&number_list);
println!("The largest number is {}", result);
let char_list = vec!['y', 'm', 'a', 'q'];
let result = largest(&char_list);
println!("The largest char is {}", result);
}
이 코드는 trait
때문에 컴파일이 되지는 않는다.
구조를 선언할 때 또한 제네릭 타입을 활용할 수 있다.
struct Point<T> {
x: T,
y: T,
}
fn main() {
let integer = Point { x: 5, y: 10 };
let float = Point { x: 1.0, y: 4.0 };
}
structs
에서와 마찬가지로 우리는 enum
을 정의할 때도 제네릭 타입을 쓸 수 있다.
enum Option<T> {
Some(T),
None,
}
enum Result<T, E> {
Ok(T),
Err(E),
}
struct Point<T> {
x: T,
y: T,
}
impl<T> Point<T> {
fn x(&self) -> &T {
&self.x
}
}
fn main() {
let p = Point { x: 5, y: 10 };
println!("p.x = {}", p.x());
}