Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Expliciting lifetime in the first example #351

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 16 additions & 12 deletions src/lifetimes.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,10 @@ explicitly is *extremely noisy*. All Rust code relies on aggressive inference
and elision of "obvious" things.

One particularly interesting piece of sugar is that each `let` statement
implicitly introduces a scope. For the most part, this doesn't really matter.
However it does matter for variables that refer to each other. As a simple
example, let's completely desugar this simple piece of Rust code:
implicitly introduces a scope immediately after the stateme. For the most part,
Arthur-Milchior marked this conversation as resolved.
Show resolved Hide resolved
this doesn't really matter. However it does matter for variables that refer to
each other. As a simple example, let's completely desugar this simple piece of
Rust code:

```rust
let x = 0;
Expand All @@ -47,21 +48,24 @@ likely desugar to the following:

<!-- ignore: desugared code -->
```rust,ignore
// NOTE: `'a: {` and `&'b x` is not valid syntax!
'a: {
// NOTE: `'global_lifetime: {` and `&'x_lifetime x` is not valid syntax!
'global_lifetime: {
let x: i32 = 0;
'b: {
// lifetime used is 'b because that's good enough.
let y: &'b i32 = &'b x;
'c: {
// ditto on 'c
let z: &'c &'b i32 = &'c y;
'x_lifetime: {
// lifetime used is 'x_lifetime because that's good enough.
let y: &'x_lifetime i32 = &'x_lifetime x;
'y_lifetime: {
// ditto on 'y_lifetime
let z: &'y_lifetime &'x_lifetime i32 = &'y_lifetime y;
Comment on lines -50 to +59
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After some re-thinking of this, I still think this is too descriptive. We easily can find 'a is a lifetime and curly braces are scopes if we're familiar with Rust's syntax. That is, naming lifetimes looks redundant, and tweaking prior wording should be enough here.

}
}
}
```

Wow. That's... awful. Let's all take a moment to thank Rust for making this easier.
Wow. That's... awful. Let's all take a moment to thank Rust for making this
easier. To make matter worse, traditionally, lifetimes are not as descriptive
and simply called `'a`, `'b`, and so on. We will respect this tradition going
forward.
Comment on lines +65 to +68
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this change is much helpful for readers and worth rephrasing so. As stated in the intro, we assume readers have a basic knowledge of Rust, actually, https://doc.rust-lang.org/nightly/book/ch10-03-lifetime-syntax.html#lifetime-annotation-syntax explains it and that should be enough.


Actually passing references to outer scopes will cause Rust to infer
a larger lifetime:
Expand Down