부록 B: 연산자와 기호
이 부록에는 러스트 문법에 대한 용어집이 들어 있습니다. 연산자뿐 아니라 경로, 제네릭, 트레이트 바운드, 매크로, 애트리뷰트, 주석, 튜플, 괄호 문맥에서 사용되는 다른 기호들도 포함합니다.
연산자
표 B-1에는 러스트의 연산자와, 그 연산자가 문맥 속에서 어떻게 나타나는지에 대한 예, 짧은 설명, 그리고 오버로딩 가능 여부가 들어 있습니다. 어떤 연산자가 오버로딩 가능하다면, 그 연산자를 오버로딩할 때 사용하는 관련 트레이트도 함께 적었습니다.
표 B-1: 연산자
| 연산자 | 예시 | 설명 | 오버로딩 가능? |
|---|---|---|---|
! | ident!(...), ident!{...}, ident![...] | 매크로 확장 | |
! | !expr | 비트/논리 보수 | Not |
!= | expr != expr | 같지 않음 비교 | PartialEq |
% | expr % expr | 산술 나머지 | Rem |
%= | var %= expr | 산술 나머지 후 대입 | RemAssign |
& | &expr, &mut expr | 대여 | |
& | &type, &mut type, &'a type, &'a mut type | 대여된 포인터 타입 | |
& | expr & expr | 비트 AND | BitAnd |
&= | var &= expr | 비트 AND 후 대입 | BitAndAssign |
&& | expr && expr | 단락 평가되는 논리 AND | |
* | expr * expr | 산술 곱셈 | Mul |
*= | var *= expr | 산술 곱셈 후 대입 | MulAssign |
* | *expr | 역참조 | Deref |
* | *const type, *mut type | raw 포인터 | |
+ | trait + trait, 'a + trait | 복합 타입 제약 | |
+ | expr + expr | 산술 덧셈 | Add |
+= | var += expr | 산술 덧셈 후 대입 | AddAssign |
, | expr, expr | 인수 및 원소 구분자 | |
- | - expr | 산술 부정 | Neg |
- | expr - expr | 산술 뺄셈 | Sub |
-= | var -= expr | 산술 뺄셈 후 대입 | SubAssign |
-> | fn(...) -> type, |…| -> type | 함수와 클로저 반환 타입 | |
. | expr.ident | 필드 접근 | |
. | expr.ident(expr, ...) | 메서드 호출 | |
. | expr.0, expr.1, and so on | 튜플 인덱싱 | |
.. | .., expr.., ..expr, expr..expr | 오른쪽 제외 범위 리터럴 | PartialOrd |
..= | ..=expr, expr..=expr | 오른쪽 포함 범위 리터럴 | PartialOrd |
.. | ..expr | 구조체 리터럴 업데이트 문법 | |
.. | variant(x, ..), struct_type { x, .. } | “나머지 모두” 패턴 바인딩 | |
... | expr...expr | (폐기 예정, 대신 ..= 사용) 패턴 안에서의 포함 범위 패턴 | |
/ | expr / expr | 산술 나눗셈 | Div |
/= | var /= expr | 산술 나눗셈 후 대입 | DivAssign |
: | pat: type, ident: type | 제약 | |
: | ident: expr | 구조체 필드 초기화 | |
: | 'a: loop {...} | 루프 레이블 | |
; | expr; | 문장 및 항목 종료자 | |
; | [...; len] | 고정 길이 배열 문법의 일부 | |
<< | expr << expr | 왼쪽 시프트 | Shl |
<<= | var <<= expr | 왼쪽 시프트 후 대입 | ShlAssign |
< | expr < expr | 작다 비교 | PartialOrd |
<= | expr <= expr | 작거나 같다 비교 | PartialOrd |
= | var = expr, ident = type | 대입/동등성 | |
== | expr == expr | 같다 비교 | PartialEq |
=> | pat => expr | match 팔 문법의 일부 | |
> | expr > expr | 크다 비교 | PartialOrd |
>= | expr >= expr | 크거나 같다 비교 | PartialOrd |
>> | expr >> expr | 오른쪽 시프트 | Shr |
>>= | var >>= expr | 오른쪽 시프트 후 대입 | ShrAssign |
@ | ident @ pat | 패턴 바인딩 | |
^ | expr ^ expr | 비트 XOR | BitXor |
^= | var ^= expr | 비트 XOR 후 대입 | BitXorAssign |
| | pat | pat | 패턴 대안 | |
| | expr | expr | 비트 OR | BitOr |
|= | var |= expr | 비트 OR 후 대입 | BitOrAssign |
|| | expr || expr | 단락 평가되는 논리 OR | |
? | expr? | 오류 전파 |
비연산자 기호
다음 표들에는 연산자로 기능하지 않는 모든 기호가 들어 있습니다. 즉, 함수 호출이나 메서드 호출처럼 동작하지 않는 기호들입니다.
표 B-2는 단독으로 나타나며 여러 위치에서 유효한 기호를 보여 줍니다.
표 B-2: 단독 문법
| 기호 | 설명 |
|---|---|
'ident | 이름 있는 라이프타임 또는 루프 레이블 |
u8, i32, f64, usize 등이 바로 뒤따르는 숫자 | 특정 타입의 숫자 리터럴 |
"..." | 문자열 리터럴 |
r"...", r#"..."#, r##"..."## 등 | 로우 문자열 리터럴, 이스케이프 문자를 처리하지 않음 |
b"..." | 바이트 문자열 리터럴, 문자열 대신 바이트 배열을 생성 |
br"...", br#"..."#, br##"..."## 등 | 로우 바이트 문자열 리터럴, 로우 문자열과 바이트 문자열의 결합 |
'...' | 문자 리터럴 |
b'...' | ASCII 바이트 리터럴 |
|…| expr | 클로저 |
! | 발산 함수의 항상 비어 있는 바텀 타입 |
_ | “무시됨” 패턴 바인딩, 정수 리터럴을 읽기 쉽게 만드는 데도 사용 |
표 B-3은 모듈 계층을 따라 항목에 이르는 경로 문맥에서 등장하는 기호를 보여 줍니다.
표 B-3: 경로 관련 문법
| 기호 | 설명 |
|---|---|
ident::ident | 네임스페이스 경로 |
::path | 크레이트 루트 기준 경로, 즉 명시적으로 절대 경로 |
self::path | 현재 모듈 기준 경로, 즉 명시적으로 상대 경로 |
super::path | 현재 모듈의 부모 기준 경로 |
type::ident, <type as trait>::ident | 연관 상수, 함수, 타입 |
<type>::... | 직접 이름 붙일 수 없는 타입의 연관 항목(예: <&T>::..., <[T]>::... 등) |
trait::method(...) | 메서드를 정의한 트레이트 이름을 적어 메서드 호출을 구분하기 |
type::method(...) | 메서드가 정의된 타입 이름을 적어 메서드 호출을 구분하기 |
<type as trait>::method(...) | 트레이트와 타입 이름을 모두 적어 메서드 호출을 구분하기 |
표 B-4는 제네릭 타입 매개변수를 사용하는 문맥에서 등장하는 기호를 보여 줍니다.
표 B-4: 제네릭
| 기호 | 설명 |
|---|---|
path<...> | 타입 안에서 제네릭 타입의 매개변수를 지정함(예: Vec<u8>) |
path::<...>, method::<...> | 표현식 안에서 제네릭 타입, 함수, 메서드의 매개변수를 지정함. 흔히 turbofish 라고 부름(예: "42".parse::<i32>()) |
fn ident<...> ... | 제네릭 함수 정의 |
struct ident<...> ... | 제네릭 구조체 정의 |
enum ident<...> ... | 제네릭 열거형 정의 |
impl<...> ... | 제네릭 구현 정의 |
for<...> type | higher ranked lifetime 바운드 |
type<ident=type> | 하나 이상의 연관 타입에 구체적인 할당을 부여한 제네릭 타입(예: Iterator<Item=T>) |
표 B-5는 트레이트 바운드로 제네릭 타입 매개변수를 제한하는 문맥에서 등장하는 기호를 보여 줍니다.
표 B-5: 트레이트 바운드 제약
| 기호 | 설명 |
|---|---|
T: U | 제네릭 매개변수 T 를 U 를 구현하는 타입으로 제한함 |
T: 'a | 제네릭 타입 T 는 라이프타임 'a 보다 오래 살아야 함(즉 'a 보다 짧은 라이프타임의 참조를 간접적으로라도 포함할 수 없음) |
T: 'static | 제네릭 타입 T 가 'static 이 아닌 빌린 참조를 포함하지 않음을 의미함 |
'b: 'a | 제네릭 라이프타임 'b 는 'a 보다 오래 살아야 함 |
T: ?Sized | 제네릭 타입 매개변수가 동적 크기 타입일 수 있게 허용함 |
'a + trait, trait + trait | 복합 타입 제약 |
표 B-6은 매크로를 호출하거나 정의하는 문맥, 그리고 항목에 애트리뷰트를 지정하는 문맥에서 등장하는 기호를 보여 줍니다.
표 B-6: 매크로와 애트리뷰트
| 기호 | 설명 |
|---|---|
#[meta] | 바깥 애트리뷰트 |
#![meta] | 안쪽 애트리뷰트 |
$ident | 매크로 치환 |
$ident:kind | 매크로 메타변수 |
$(...)... | 매크로 반복 |
ident!(...), ident!{...}, ident![...] | 매크로 호출 |
표 B-7은 주석을 만드는 기호를 보여 줍니다.
표 B-7: 주석
| 기호 | 설명 |
|---|---|
// | 줄 주석 |
//! | 안쪽 줄 문서 주석 |
/// | 바깥 줄 문서 주석 |
/*...*/ | 블록 주석 |
/*!...*/ | 안쪽 블록 문서 주석 |
/**...*/ | 바깥 블록 문서 주석 |
표 B-8은 괄호가 사용되는 문맥을 보여 줍니다.
표 B-8: 소괄호
| 기호 | 설명 |
|---|---|
() | 빈 튜플(즉 unit), 리터럴이자 타입 |
(expr) | 괄호로 감싼 표현식 |
(expr,) | 원소가 하나인 튜플 표현식 |
(type,) | 원소가 하나인 튜플 타입 |
(expr, ...) | 튜플 표현식 |
(type, ...) | 튜플 타입 |
expr(expr, ...) | 함수 호출 표현식, 튜플 구조체와 튜플 열거형 variant 초기화에도 사용됨 |
표 B-9는 중괄호가 사용되는 문맥을 보여 줍니다.
표 B-9: 중괄호
| 문맥 | 설명 |
|---|---|
{...} | 블록 표현식 |
Type {...} | 구조체 리터럴 |
표 B-10은 대괄호가 사용되는 문맥을 보여 줍니다.
표 B-10: 대괄호
| 문맥 | 설명 |
|---|---|
[...] | 배열 리터럴 |
[expr; len] | expr 를 len 번 복사해 담은 배열 리터럴 |
[type; len] | type 인스턴스 len 개를 담는 배열 타입 |
expr[expr] | 컬렉션 인덱싱, 오버로딩 가능(Index, IndexMut) |
expr[..], expr[a..], expr[..b], expr[a..b] | Range, RangeFrom, RangeTo, RangeFull 을 “인덱스” 로 사용해 컬렉션 슬라이싱처럼 보이게 하는 컬렉션 인덱싱 |