튜플과 튜플 인덱싱 표현식

튜플과 튜플 인덱싱 표현식 (Tuple and Tuple Indexing Expressions)

여러 값을 순서대로 한 묶음으로 묶고 싶을 때 튜플을 쓰죠. 그리고 묶인 값 하나를 꺼낼 때는 .0, .1 같은 인덱싱을 사용하는데요. 이 두 표현식이 문법적으로 어떻게 정의되어 있는지 정리해 볼게요.

출처: Rust Reference

튜플 표현식 (Tuple Expression)

문법 (Syntax)

TupleExpression → ( TupleElements? )
TupleElements   → ( Expression , )+ Expression?

튜플 표현식(tuple expression)튜플 값을 만듭니다.

튜플 표현식의 문법은 괄호로 묶인 콤마 구분 표현식 목록이며, 각각을 tuple initializer operand(튜플 초기화 피연산자)라고 부릅니다.

1-ary(인자가 하나인) 튜플 표현식은 괄호 표현식(parenthetical expression)과 구분되도록, 튜플 초기화 피연산자 뒤에 콤마를 반드시 붙여야 해요. (4)(4,)가 다르다는 것만 기억하면 됩니다.

튜플 표현식은 튜플 타입의 새로 구축된 값으로 평가되는 값 표현식(value expression)입니다.

튜플 초기화 피연산자의 개수가 곧 만들어지는 튜플의 arity(항수)가 됩니다.

튜플 초기화 피연산자가 하나도 없는 튜플 표현식은 unit 튜플(())을 만들어냅니다.

그 밖의 튜플 표현식에서는 처음 적힌 튜플 초기화 피연산자가 필드 0을 초기화하고, 이후 피연산자들이 다음으로 큰 필드를 초기화합니다. 예를 들어 튜플 표현식 ('a', 'b', 'c')에서 'a'는 필드 0, 'b'는 필드 1, 'c'는 필드 2의 값을 초기화해요.

튜플 표현식과 그 타입의 예를 볼게요.

Expression Type
() () (unit)
(0.0, 4.5) (f64, f64)
("x".to_string(), ) (String, )
("a", 4usize, true) (&'static str, usize, bool)

튜플 인덱싱 표현식 (Tuple Indexing Expression)

문법 (Syntax)

TupleIndexingExpression → Expression . TUPLE_INDEX

튜플 인덱싱 표현식(tuple indexing expression)튜플튜플 struct의 필드에 접근합니다.

튜플 인덱스 표현식의 문법은 tuple operand(튜플 피연산자)라 부르는 표현식, 그다음 ., 마지막으로 튜플 인덱스로 구성됩니다.

튜플 인덱스 의 문법은 십진 리터럴이되, 앞의 0·밑줄·접미사를 가질 수 없습니다. 예를 들어 02는 유효한 튜플 인덱스지만 01, 0_, 0i32는 아니에요.

튜플 피연산자의 타입은 튜플 타입이거나 튜플 struct여야 합니다.

튜플 인덱스는 튜플 피연산자의 타입이 가진 필드의 이름 중 하나여야 합니다.

튜플 인덱스 표현식의 평가는 튜플 피연산자의 평가 외에는 부수 효과가 없습니다. place 표현식으로서, 튜플 인덱스와 같은 이름을 가진 튜플 피연산자의 필드 위치로 평가됩니다.

튜플 인덱싱 표현식의 예를 볼게요.

#![allow(unused)]
fn main() {
// Indexing a tuple
let pair = ("a string", 2);
assert_eq!(pair.1, 2);

// Indexing a tuple struct
struct Point(f32, f32);
let point = Point(1.0, 0.0);
assert_eq!(point.0, 1.0);
assert_eq!(point.1, 0.0);
}

참고 필드 접근 표현식과 달리, 튜플 인덱스 표현식은 호출 표현식의 함수 피연산자가 될 수 있어요. 메서드 이름은 숫자가 될 수 없으므로 메서드 호출과 혼동될 일이 없기 때문입니다.

참고 배열과 슬라이스에도 요소가 있지만, 그 요소를 접근할 때는 배열·슬라이스 인덱싱 표현식이나 슬라이스 패턴을 사용해야 합니다. 튜플 인덱싱 문법은 튜플에만 해당돼요.

더 알아보기 (Learn more)