튜플은 정해진 개수의, 서로 다른 타입일 수도 있는 데이터를 하나로 묶는 가벼운 방법이에요. 튜플에는 따로
이름이 없어요. 데이터 구조에 이름을 붙이면 그건 struct가 돼요. 튜플의 필드에도 이름이 없어요.
필드는 구조 분해를 하거나 위치를 통해 접근해요.
튜플은 항상 튜플 표현식으로 만들어요:
// pointless but legal
let unit = ();
// single element
let single_element = ("note the comma",);
// two element
let two_element = (123, "elements can be of differing types");
튜플은 원소를 원하는 만큼 가질 수 있어요.
구조 분해를 통해서도 튜플의 원소에 접근할 수 있어요. 구조 분해란 튜플의 각 원소에 변수 이름을 붙이는 것을 말하고, 이 과정에서 튜플은 소비돼요.
let (elem1, _elem2) = two_element;
assert_eq!(elem1, 123);
숫자로 된 위치 인덱스로도 튜플의 원소에 접근할 수 있어요. 인덱스는 언제나처럼 0부터 시작해요.
let notation = single_element.0;
assert_eq!(notation, "note the comma");
앞으로 튜플 구조체도 다루게 될 거예요. 일반 구조체와 마찬가지로 튜플 구조체도 이름이 있는 타입이에요. 다만 일반 구조체와 달리 필드가 익명이에요. 문법은 일반적인 튜플 문법과 아주 비슷해요. 구조 분해와 위치 접근을 모두 사용할 수 있어요.
struct TupleStruct(u8, i32);
let my_tuple_struct = TupleStruct(123, -321);
let neg = my_tuple_struct.1;
let TupleStruct(byte, _) = my_tuple_struct;
assert_eq!(neg, -321);
assert_eq!(byte, 123);
익명 튜플의 모든 필드는 항상 공개예요. 하지만 튜플 구조체의 필드는 각각 가시성을 가지고,
그 기본값은 일반 구조체의 필드와 마찬가지로 비공개예요. 일반 구조체에서처럼 pub 제한자를
붙여 필드를 공개로 만들 수 있어요.
// fails due to private fields
mod tuple { pub struct TupleStruct(u8, i32); }
fn main() { let _my_tuple_struct = tuple::TupleStruct(123, -321); }
// succeeds: fields are public
mod tuple { pub struct TupleStruct(pub u8, pub i32); }
fn main() { let _my_tuple_struct = tuple::TupleStruct(123, -321); }
저전력 임베디드 시스템을 대상으로 하는 게임을 만들고 있는데, 게임의 다른 부분에서 사용할 여러 편의 함수를 작성해야 해요.
몫은 나눗셈의 결과예요.
fn divmod(dividend: i16, divisor: i16) -> (i16, i16)
예시:
assert_eq!(divmod(10, 3), (3, 1));
이 함수는 화면 버퍼 최적화를 가능하게 하는 데 도움이 될 거라고 상사가 장담했어요.
반복자는 Iterator 트레이트에 정의된 메서드를 제공하는 항목이에요. 반복자가 제공하는 메서드가 많기 때문에 그 문서도 꽤 방대해요. 가장 관련 있는 특징은 다음과 같아요:
(i, val)을 반환하는 enumerate 메서드가 있어요filter 메서드가 있어요map 메서드가 있어요함수는 어떤 종류의 반복자에서도 동작할 수 있기 때문에, 단순한 항목이 아니라 트레이트 인스턴스라는 것을 나타내기 위해 impl을 사용해요. 마찬가지로 <Item=T> 문법은 반복자가 만들어 내는 항목의 종류가 무엇이든 상관없다는 뜻일 뿐이에요. 함수는 어떤 반복자에서든 짝수 원소를 만들어 낼 수 있어요.
fn evens<T>(iter: impl Iterator<Item=T>) -> impl Iterator<Item=T>
예시:
let mut even_ints = evens(0_u8..);
assert_eq!(even_ints.next(), Some(0));
assert_eq!(even_ints.next(), Some(2));
assert_eq!(even_ints.next(), Some(4));
assert_eq!(even_ints.next(), Some(6));
let mut evens_from_odds = evens(1_i16..);
assert_eq!(evens_from_odds.next(), Some(1));
assert_eq!(evens_from_odds.next(), Some(3));
assert_eq!(evens_from_odds.next(), Some(5));
assert_eq!(evens_from_odds.next(), Some(7));
매핑을 편하게 하기 위해 튜플 구조체 Position이 있어요:
struct Position(i16, i16);
Position에, 원점(Position(0, 0))에서 해당 위치까지의 맨해튼 거리를 반환하는 manhattan 메서드를 구현해야 해요.
impl Position {
fn manhattan(&self) -> i16
}
예시:
assert_eq!(Position(3, 4).manhattan(), 7);