소개
이 랩에서는 Rust 의 튜플 (tuple) 을 탐구합니다. 튜플은 서로 다른 타입의 값들을 묶어 놓은 컬렉션이며, 괄호를 사용하여 생성됩니다. 튜플은 함수 인자 (argument) 및 반환 값으로 사용될 수 있으며, 함수가 여러 값을 반환할 수 있도록 합니다. 튜플은 다른 튜플의 멤버로도 사용될 수 있습니다. Rust 는 튜플 내의 값에 접근하기 위해 튜플 인덱싱 (tuple indexing) 을 제공합니다. 튜플은 출력 가능하며, 바인딩 (binding) 을 생성하기 위해 분해 (destructure) 될 수 있습니다. 또한, 구조체 (struct) 의 출력 형식을 사용자 정의하기 위해 fmt::Display 트레이트 (trait) 를 추가하는 방법을 배웁니다. 마지막으로, 행렬 (matrix) 의 두 요소를 교환하는 transpose 함수를 구현하는 활동을 수행합니다.
참고: 랩에서 파일 이름을 지정하지 않은 경우, 원하는 파일 이름을 사용할 수 있습니다. 예를 들어,
main.rs를 사용하고rustc main.rs && ./main으로 컴파일하고 실행할 수 있습니다.
튜플 (Tuples)
튜플은 서로 다른 타입의 값들을 묶어 놓은 컬렉션입니다. 튜플은 괄호 ()를 사용하여 생성되며, 각 튜플 자체는 타입 시그니처 (type signature) (T1, T2, ...)를 갖는 값입니다. 여기서 T1, T2는 멤버들의 타입입니다. 함수는 튜플을 사용하여 여러 값을 반환할 수 있는데, 튜플은 임의의 수의 값을 담을 수 있기 때문입니다.
// 튜플은 함수 인자 (argument) 및 반환 값으로 사용될 수 있습니다.
fn reverse(pair: (i32, bool)) -> (bool, i32) {
// `let` 은 튜플의 멤버들을 변수에 바인딩 (bind) 하는 데 사용될 수 있습니다.
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);
// 튜플 인덱싱 (tuple indexing) 을 사용하여 튜플에서 값을 추출할 수 있습니다.
println!("Long tuple first value: {}", long_tuple.0);
println!("Long tuple second value: {}", long_tuple.1);
// 튜플은 튜플 멤버가 될 수 있습니다.
let tuple_of_tuples = ((1u8, 2u16, 2u32), (4u64, -1i8), -2i16);
// 튜플은 출력 가능합니다.
println!("tuple of tuples: {:?}", 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 ^ 컴파일러 오류를 보려면 위의 2 줄의 주석을 해제하세요.
let pair = (1, true);
println!("Pair is {:?}", pair);
println!("The reversed pair is {:?}", reverse(pair));
// 단일 요소 튜플을 생성하려면 쉼표가 필요하며, 괄호로 묶인 리터럴과 구별합니다.
println!("One element tuple: {:?}", (5u32,));
println!("Just an integer: {:?}", (5u32));
// 튜플은 바인딩 (binding) 을 생성하기 위해 분해 (destructure) 될 수 있습니다.
let tuple = (1, "hello", 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트레이트 (trait) 를 추가하여 디버그 형식{:?}에서 표시 형식{}으로 전환하면 다음과 같은 출력이 나타나도록 합니다.( 1.1 1.2 ) ( 2.1 2.2 )출력 표시 예제를 다시 참조할 수 있습니다.
reverse함수를 템플릿으로 사용하여transpose함수를 추가합니다. 이 함수는 매트릭스를 인자로 받아 두 요소를 교환한 매트릭스를 반환합니다. 예를 들어:println!("Matrix:\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 )
요약
축하합니다! 튜플 랩을 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 실력을 향상시킬 수 있습니다.