Raw identifiers - The Edition Guide

# Raw identifiers

Rust, like many programming languages, has the concept of "keywords". These identifiers mean something to the language, and so you cannot use them in places like variable names, function names, and other places. Raw identifiers let you use keywords where they would not normally be allowed.

For example, `match` is a keyword. If you try to compile this function:

    fn match(needle: &str, haystack: &str) -> bool {
        haystack.contains(needle)
    }

You'll get this error:

    error: expected identifier, found keyword `match`
     --> src/main.rs:4:4
      |
    4 | fn match(needle: &str, haystack: &str) -> bool {
      |    ^^^^^ expected identifier, found keyword

You can write this with a raw identifier:

    fn r#match(needle: &str, haystack: &str) -> bool {
        haystack.contains(needle)
    }

    fn main() {
        assert!(r#match("foo", "foobar"));
    }

Note the `r#` prefix on both the function name as well as the call.

## Motivation

This feature is useful for a few reasons, but the primary motivation was inter-edition situations. For example, `try` is not a keyword in the 2015 edition, but is in the 2018 edition. So if you have a library that is written in Rust 2015 and has a `try` function, to call it in Rust 2018, you'll need to use the raw identifier.

## New keywords

The new confirmed keywords in edition 2018 are:

### `async` and `await`

Here, `async` is reserved for use in `async fn` as well as in `async ||` closures and `async { .. }` blocks. Meanwhile, `await` is reserved to keep our options open with respect to `await!(expr)` syntax. See RFC 2394 for more details.

### `try`

The `do catch { .. }` blocks have been renamed to `try { .. }` and to support that, the keyword `try` is reserved in edition 2018. See RFC 2388 for more details.