Skip to content

Commit

Permalink
Document the ref keyword
Browse files Browse the repository at this point in the history
  • Loading branch information
poliorcetics committed Jun 23, 2020
1 parent dcd470f commit 2853448
Showing 1 changed file with 42 additions and 2 deletions.
44 changes: 42 additions & 2 deletions src/libstd/keyword_docs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -991,9 +991,49 @@ mod pub_keyword {}
//
/// Bind by reference during pattern matching.
///
/// The documentation for this keyword is [not yet complete]. Pull requests welcome!
/// `ref` annotates pattern bindings to make them borrow rather than move.
/// It is **not** a part of the pattern as far as matching is concerned.
///
/// By default, [`match`] statements consume all they can, which can sometimes
/// be a problem, when you don't really need the value to be moved and owned:
///
/// ```compile_fail,E0382
/// let maybe_name = Some(String::from("Alice"));
/// // The variable 'maybe_name' is consumed here ...
/// match maybe_name {
/// Some(n) => println!("Hello, {}", n),
/// _ => println!("Hello, world"),
/// }
/// // ... and now unavailable.
/// println!("Hello again, {}", maybe_name.unwrap_or("world".into()));
/// ```
///
/// [not yet complete]: https://github.com/rust-lang/rust/issues/34601
/// Using the `ref` keyword, the value is only borrowed, not moved, making
/// available for use after the [`match`] statement:
///
/// ```
/// let maybe_name = Some(String::from("Alice"));
/// // Using `ref`, the value is borrowed, not moved ...
/// match maybe_name {
/// Some(ref n) => println!("Hello, {}", n),
/// _ => println!("Hello, world"),
/// }
/// // ... and it's available here !
/// println!("Hello again, {}", maybe_name.unwrap_or("world".into()));
/// ```
///
/// # `&` vs `ref`
///
/// - `&` denotes that your pattern expects a reference to an object. Hence `&`
/// is a part of said pattern: `&Foo` matches different objects than `Foo` does.
///
/// - `ref` indicates that you want a reference to an unpacked value. It is not
/// matched against: `Foo(ref foo)` matches the same objects as `Foo(foo)`.
///
/// See also the [Reference] for more information.
///
/// [`match`]: keyword.match.html
/// [Reference]: ../reference/patterns.html#identifier-patterns
mod ref_keyword {}

#[doc(keyword = "return")]
Expand Down

0 comments on commit 2853448

Please sign in to comment.