튜플
튜플은 서로 다른 타입의 값들의 모음입니다. 튜플은 괄호 ()를 사용하여 생성되며, 각 튜플 자체는 (T1, T2, ...) 형태의 타입 시그니처를 가진 값입니다. 여기서 T1, T2는 튜플 멤버의 타입입니다. 튜플은 여러 값을 담을 수 있으므로 함수에서 여러 값을 반환하는 데 사용할 수 있습니다.
// 튜플은 함수의 인자와 반환값으로 사용될 수 있습니다.
fn reverse(pair: (i32, bool)) -> (bool, i32) {
// `let`을 사용하여 튜플의 멤버를 변수에 바인딩할 수 있습니다.
let (int_param, bool_param) = pair;
(bool_param, int_param)
}
// 다음 구조체는 실습을 위한 것입니다.
#[derive(Debug)]
struct Matrix(f32, f32, f32, f32);
fn main() {
// 여러 다른 타입을 가진 튜플입니다.
let long_tuple = (1u8, 2u16, 3u32, 4u64,
-1i8, -2i16, -3i32, -4i64,
0.1f32, 0.2f64,
'a', true);
// 튜플 인덱싱을 사용하여 튜플에서 값을 추출할 수 있습니다.
println!("긴 튜플의 첫 번째 값: {}", long_tuple.0);
println!("긴 튜플의 두 번째 값: {}", long_tuple.1);
// 튜플은 튜플의 멤버가 될 수 있습니다.
let tuple_of_tuples = ((1u8, 2u16, 2u32), (4u64, -1i8), -2i16);
// 튜플은 출력 가능합니다.
println!("튜플의 튜플: {:?}", tuple_of_tuples);
// 하지만 긴 튜플(요소 12개 초과)은 출력할 수 없습니다.
//let too_long_tuple = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13);
//println!("Too long tuple: {:?}", too_long_tuple);
// TODO ^ 위의 두 줄의 주석을 해제하여 컴파일 에러를 확인해 보세요
let pair = (1, true);
println!("페어는 {:?}입니다", pair);
println!("반전된 페어는 {:?}입니다", reverse(pair));
// 요소가 하나인 튜플을 만들려면, 괄호로 둘러싸인 리터럴과
// 구분하기 위해 콤마가 필요합니다.
println!("요소가 하나인 튜플: {:?}", (5u32,));
println!("그냥 정수: {:?}", (5u32));
// 튜플은 구조 분해(destructure)하여 바인딩을 생성할 수 있습니다.
let tuple = (1, "안녕", 4.5, true);
let (a, b, c, d) = tuple;
println!("{:?}, {:?}, {:?}, {:?}", a, b, c, d);
let matrix = Matrix(1.1, 1.2, 2.1, 2.2);
println!("{:?}", matrix);
}
실습
-
요약: 위 예제의
Matrix구조체에fmt::Display트레이트를 추가하여, 디버그 형식{:?}에서 디스플레이 형식{}로 출력을 전환했을 때 다음과 같은 출력이 나오도록 하세요:( 1.1 1.2 ) ( 2.1 2.2 )표시 출력에 대한 예제를 다시 참조하고 싶을 수도 있습니다.
-
reverse함수를 템플릿으로 사용하여transpose함수를 추가하세요. 이 함수는 행렬을 인자로 받아 두 요소가 바뀐 행렬을 반환합니다. 예를 들어:println!("행렬:\n{}", matrix); println!("전치(Transpose):\n{}", transpose(matrix));출력 결과:
Matrix: ( 1.1 1.2 ) ( 2.1 2.2 ) Transpose: ( 1.1 2.1 ) ( 1.2 2.2 )