부록 A: 키워드
다음 목록에는 러스트 언어가 현재 또는 미래에 사용할 목적으로 예약해 둔 키워드가 들어 있습니다. 따라서 이 단어들은 식별자로 사용할 수 없습니다(“로우 식별자” 절에서 다루는 로우 식별자는 예외입니다). 식별자 는 함수, 변수, 매개변수, 구조체 필드, 모듈, 크레이트, 상수, 매크로, 정적 값, 애트리뷰트, 타입, 트레이트, 라이프타임의 이름을 말합니다.
현재 사용 중인 키워드
다음은 현재 사용 중인 키워드 목록과 그 기능 설명입니다.
as: 기본 타입 캐스팅을 수행하거나, 특정 항목을 담고 있는 정확한 트레이트를 구분하거나,use문에서 항목 이름을 바꿉니다.async: 현재 스레드를 막지 않고Future를 반환합니다.await:Future의 결과가 준비될 때까지 실행을 중단합니다.break: 루프를 즉시 빠져나옵니다.const: 상수 항목이나 상수 raw 포인터를 정의합니다.continue: 다음 루프 반복으로 넘어갑니다.crate: 모듈 경로 안에서 크레이트 루트를 가리킵니다.dyn: 트레이트 객체에 대해 동적 디스패치를 수행합니다.else:if,if let제어 흐름 구문의 대체 경로를 나타냅니다.enum: 열거형을 정의합니다.extern: 외부 함수나 변수를 연결합니다.false: 불리언 거짓 리터럴입니다.fn: 함수를 정의하거나 함수 포인터 타입을 정의합니다.for: 반복자에서 항목을 순회하거나, 트레이트를 구현하거나, higher ranked lifetime 을 지정합니다.if: 조건식 결과에 따라 분기합니다.impl: 고유 메서드나 트레이트 기능을 구현합니다.in:for루프 문법의 일부입니다.let: 변수를 바인딩합니다.loop: 무조건 반복합니다.match: 값을 패턴과 매칭합니다.mod: 모듈을 정의합니다.move: 클로저가 캡처한 모든 값을 소유하도록 만듭니다.mut: 참조, raw 포인터, 패턴 바인딩의 가변성을 나타냅니다.pub: 구조체 필드,impl블록, 모듈의 공개 가시성을 나타냅니다.ref: 참조로 바인딩합니다.return: 함수에서 반환합니다.Self: 현재 정의하거나 구현 중인 타입을 가리키는 타입 별칭입니다.self: 메서드의 대상이거나 현재 모듈을 가리킵니다.static: 전역 변수이거나 프로그램 전체 실행 동안 지속되는 라이프타임을 나타냅니다.struct: 구조체를 정의합니다.super: 현재 모듈의 부모 모듈을 가리킵니다.trait: 트레이트를 정의합니다.true: 불리언 참 리터럴입니다.type: 타입 별칭이나 연관 타입을 정의합니다.union: 유니언 을 정의합니다. 유니언 선언에서 사용할 때만 키워드입니다.unsafe: unsafe 코드, 함수, 트레이트, 구현을 나타냅니다.use: 심벌을 현재 스코프로 가져옵니다.where: 타입을 제한하는 절을 나타냅니다.while: 표현식 결과에 따라 조건부로 반복합니다.
미래 사용을 위해 예약된 키워드
다음 키워드들은 아직 기능은 없지만, 러스트가 미래에 사용할 가능성에 대비해 예약해 두었습니다.
abstractbecomeboxdofinalgenmacrooverrideprivtrytypeofunsizedvirtualyield
로우 식별자
로우 식별자 는 원래는 허용되지 않는 위치에서 키워드를 사용할 수 있게 해 주는
문법입니다. 키워드 앞에 r# 를 붙여 사용합니다.
예를 들어 match 는 키워드입니다. 다음처럼 match 를 함수 이름으로 사용하는 코드를
컴파일하려 하면,
Filename: src/main.rs
fn match(needle: &str, haystack: &str) -> bool {
haystack.contains(needle)
}
다음 오류를 얻게 됩니다.
error: expected identifier, found keyword `match`
--> src/main.rs:4:4
|
4 | fn match(needle: &str, haystack: &str) -> bool {
| ^^^^^ expected identifier, found keyword
오류 메시지는 match 키워드를 함수 식별자로 쓸 수 없다는 사실을 보여 줍니다.
match 를 함수 이름으로 쓰려면 다음처럼 로우 식별자 문법을 사용해야 합니다.
Filename: src/main.rs
fn r#match(needle: &str, haystack: &str) -> bool {
haystack.contains(needle)
}
fn main() {
assert!(r#match("foo", "foobar"));
}
이 코드는 오류 없이 컴파일됩니다. 함수 정의에서도, main 에서 함수를 호출하는
곳에서도 함수 이름 앞에 r# 접두사가 붙는다는 점에 주목하세요.
로우 식별자를 사용하면, 그 단어가 예약 키워드라 해도 원하는 어떤 단어든 식별자로
쓸 수 있습니다. 덕분에 식별자 이름을 더 자유롭게 지을 수 있고, 해당 단어들이 키워드가
아닌 언어로 작성된 프로그램과도 더 쉽게 통합할 수 있습니다. 또한 로우 식별자는
현재 크레이트와 다른 러스트 에디션으로 작성된 라이브러리를 사용할 수 있게 도와줍니다.
예를 들어 try 는 2015 에디션에서는 키워드가 아니지만 2018, 2021, 2024 에디션에서는
키워드입니다. 만약 2015 에디션으로 작성된 라이브러리에 try 함수가 있고 그
라이브러리에 의존한다면, 이후 에디션의 코드에서는 그 함수를 호출할 때 r#try 처럼
로우 식별자 문법을 써야 합니다. 에디션에 대한 자세한 내용은 부록 E 를 참고하세요.