Rollup merge of #37255 - mbrubeck:doc-edit, r=steveklabnik

Fix some mistakes in HRTB docs

The example code for higher-ranked trait bounds on closures had an unnecessary `mut` which was confusing, and the text referred to an mutable reference which does not exist in the code (and isn't needed).  Removed the `mut`s and fixed the text to better describe the actual error for the failing example.

Thanks to csd_ on IRC for pointing out these problems!

r? @steveklabnik
This commit is contained in:
Alex Crichton 2016-11-04 16:49:28 -07:00 committed by GitHub
commit c0bc35a364

View File

@ -327,7 +327,7 @@ that takes a reference like so:
fn call_with_ref<F>(some_closure:F) -> i32 fn call_with_ref<F>(some_closure:F) -> i32
where F: Fn(&i32) -> i32 { where F: Fn(&i32) -> i32 {
let mut value = 0; let value = 0;
some_closure(&value) some_closure(&value)
} }
``` ```
@ -340,14 +340,15 @@ fn call_with_ref<'a, F>(some_closure:F) -> i32
where F: Fn(&'a i32) -> i32 { where F: Fn(&'a i32) -> i32 {
``` ```
However this presents a problem in our case. When you specify the explicit However, this presents a problem in our case. When a function has an explicit
lifetime on a function it binds that lifetime to the *entire* scope of the function lifetime parameter, that lifetime must be at least as long as the *entire*
instead of just the invocation scope of our closure. This means that the borrow checker call to that function. The borrow checker will complain that `value` doesn't
will see a mutable reference in the same lifetime as our immutable reference and fail live long enough, because it is only in scope after its declaration inside the
to compile. function body.
In order to say that we only need the lifetime to be valid for the invocation scope What we need is a closure that can borrow its argument only for its own
of the closure we can use Higher-Ranked Trait Bounds with the `for<...>` syntax: invocation scope, not for the outer function's scope. In order to say that,
we can use Higher-Ranked Trait Bounds with the `for<...>` syntax:
```ignore ```ignore
fn call_with_ref<F>(some_closure:F) -> i32 fn call_with_ref<F>(some_closure:F) -> i32
@ -362,7 +363,7 @@ expect.
fn call_with_ref<F>(some_closure:F) -> i32 fn call_with_ref<F>(some_closure:F) -> i32
where F: for<'a> Fn(&'a i32) -> i32 { where F: for<'a> Fn(&'a i32) -> i32 {
let mut value = 0; let value = 0;
some_closure(&value) some_closure(&value)
} }
``` ```