One might expect it to compile. We call `mutate_and_share`, which mutably borrows
`foo`*temporarily*, but then returns *only* a shared reference. Therefore we
would expect `foo.share()` to succeed as `foo` shouldn't be mutably borrowed.
However when we try to compile it:
```text
<anon>:11:5: 11:8 error: cannot borrow `foo` as immutable because it is also borrowed as mutable
<anon>:11 foo.share();
^~~
<anon>:10:16: 10:19 note: previous borrow of `foo` occurs here; the mutable borrow prevents subsequent moves, borrows, or modification of `foo` until the borrow ends
<anon>:10 let loan = foo.mutate_and_share();
^~~
<anon>:12:2: 12:2 note: previous borrow ends here
<anon>:8 fn main() {
<anon>:9 let mut foo = Foo;
<anon>:10 let loan = foo.mutate_and_share();
<anon>:11 foo.share();
<anon>:12 }
^
```
```
One would expect the output of foo to be an immutable lifetime. However we have
What happened? Well, the lifetime of `loan` is derived from a *mutable* borrow.
derived it from the input, which is a mutable lifetime. So although we have a
This makes the type system believe that `foo` is mutably borrowed as long as
shared reference, it will have the much more limited aliasing rules of a mutable
`loan` exists, even though it's a shared reference. To my knowledge, this is not
reference. As a consequence, there is no expressive benefit in a method that
a bug.
mutates returning a shared reference.
@ -413,7 +450,7 @@ respectively.
## PhantomData and PhantomFn
## PhantomData
This is all well and good for the types the standard library provides, but
This is all well and good for the types the standard library provides, but
how is variance determined for type that *you* define? A struct is, informally
how is variance determined for type that *you* define? A struct is, informally
@ -475,6 +512,8 @@ pub struct Iter<'a, T: 'a> {
```
```
## Splitting Lifetimes
## Splitting Lifetimes
The mutual exclusion property of mutable references can be very limiting when
The mutual exclusion property of mutable references can be very limiting when