News for hackers. Stuff that matters.
Re:Announcing Rust 1.30 by shepmaster on Thursday October 25, 2018 @01:30PM (#18302648)
In edition 2018, Rust now has reserved `async` and `await` as keywords. Since crates written targeting edition 2018 need to interoperate with edition 2015 (and vice-versa), some syntax is needed to be able to use identifiers that are also keywords.

For example, my 2015 crate might have a function `fn async(enabled: bool)` that I need to call from 2015. I could call it as `r#async(true)`.

This follows the existing syntax of `r"foo"` / `r###"foo"###` for raw strings as well as raw byte literals: `br##"HELO"##`;

Another use case will be for libraries like Diesel [0], a SQL query builder. People want to be able to search the documentation for SQL's `WHERE`, but `where` is keyword in Rust. They could choose to add a method called `r#where` to allow this kind of discoverability.

[0]: https://diesel.rs/

Re:Announcing Rust 1.30 by steveklabnik on Thursday October 25, 2018 @01:31PM (#18302664)
I read the parent as suggesting that you could call it as

  _async(true)
Re:Announcing Rust 1.30 by weberc2 on Thursday October 25, 2018 @02:48PM (#18303461)
No, this isn't what I meant to imply (though I understand your confusion). I didn't realize (or understand) that the syntax is meant to facilitate interoperability between different versions of Rust.
Re:Announcing Rust 1.30 by shepmaster on Thursday October 25, 2018 @01:35PM (#18302713)
Ah. If that's the case, as you point out people might have already been using a leading underscore (although they shouldn't for idiomatic reasons), leading to ambiguity around

2015 code:

     fn async(enabled: bool) {}
     fn _async(enabled: bool) {}
2018 code calling that:

    _async(true); // Which is this calling?