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

ch04-03: String Slices, explain non-lexical lifetimes #1939

Closed
owenthereal opened this issue Apr 29, 2019 · 1 comment · Fixed by rust-lang/rust#87503
Closed

ch04-03: String Slices, explain non-lexical lifetimes #1939

owenthereal opened this issue Apr 29, 2019 · 1 comment · Fixed by rust-lang/rust#87503
Milestone

Comments

@owenthereal
Copy link

owenthereal commented Apr 29, 2019

Trying to follow the example in the String Slices section:

fn main() {
    let mut s = String::from("hello world");

    let word = first_word(&s);

    s.clear(); // error!

    println!("the first word is: {}", word);
}

fn first_word(s: &String) -> &str {
    let bytes = s.as_bytes();

    for (i, &item) in bytes.iter().enumerate() {
        if item == b' ' {
            return &s[0..i];
        }
    }

    &s[..]
}

If I remove the line that makes use of to word (println!("the first word is: {}", word);), the compilation error as the following

error[E0502]: cannot borrow `s` as mutable because it is also borrowed as immutable
  --> src/main.rs:18:5
   |
16 |     let word = first_word(&s);
   |                           -- immutable borrow occurs here
17 |
18 |     s.clear(); // error!
   |     ^^^^^^^^^ mutable borrow occurs here
19 |
20 |     println!("the first word is: {}", word);
   |                                       ---- immutable borrow later used here

goes away. This doesn't make sense because I would expect regardless word is used or not, s.clear() should yield the same compilation error. That makes me wonder whether there's a bug in the rust compiler. If this is expected, it would worth explaining more.

See the playground code for compilation error and the one without compilation error that has no word reference removed

@carols10cents
Copy link
Member

There is no bug; this is because of Non-lexical lifetimes. The Rust compiler recently learned how to tell when a borrow is finished before the end of the scope.

We could certainly add more explanation at this point.

@carols10cents carols10cents changed the title ch04-03: String Slides ch04-03: String Slices, explain non-lexical lifetimes Apr 29, 2019
@carols10cents carols10cents added this to the ch4 milestone Apr 29, 2019
JohnTitor added a commit to JohnTitor/rust that referenced this issue Jul 27, 2021
Update books

## nomicon

1 commits in 7a13537f96af4b9b8e3ea296d6e5c3c7ab72ce9f..f51734eb5566c826b471977747ea3d7d6915bbe9
2021-07-05 23:34:47 -0400 to 2021-07-23 18:24:35 +0900
- Add cloning example for dot operator behaviour (rust-lang/nomicon#292)

## reference

3 commits in 82d75cf423e4a7824fb36e73ccb18519d6900610..3b7be075af5d6e402a18efff672a8a265b4596fd
2021-07-15 06:49:08 -0700 to 2021-07-26 13:20:11 -0700
- Fix typos + grammar (rust-lang/reference#1037)
- Expand on Unicode identifiers. (rust-lang/reference#1022)
- Remove incorrect apostrophe (rust-lang/reference#1076)

## book

17 commits in eac55314210519238652f12b30fec9daea61f7fe..a07036f864b37896b31eb996cd7aedb489f69a1f
2021-07-19 11:08:01 -0400 to 2021-07-26 20:19:46 -0400
- Set expectations a bit more realistically
- Snapshot of chapter 4 for nostarch
- A few small wording tweaks in ch 4
- Clarify that it's not stack/heap exactly that matters for copy/non copy, fixes rust-lang/book#2799
- Clarify a detail around move. Fixes rust-lang/book#2413.
- Clarify places that changed because of NLL. Fixes rust-lang/book#1939.
- nostarch ch3
- Small edits to chapter 3
-  (rust-lang/book#2797)
- Update ch03-03-how-functions-work.md: Pervasive -> Prevalent. (rust-lang/book#2796)
- Address loop labels and continue. Fixes rust-lang/book#1392.
- Clarify behavior of integer division. Fixes rust-lang/book#2248.
- Demonstrate how scope interacts with shadowing
- Add another cross-reference to the new unit type introduction
- Introduce the unit type with tuples. Fixes rust-lang/book#1933.
- Reword sentence to not have numbers separated only by a comma
- Link directly to other installation page. Fixes rust-lang/book#1609

## rust-by-example

1 commits in 1db6bb483cc87ad3b424d9aba764fe622960a1be..0dc9cd4e89f00cb5230f120e1a083916386e422b
2021-07-15 06:17:42 -0300 to 2021-07-23 09:14:27 -0300
- Grammatical mistake: Comparison as ... as the (rust-lang/rust-by-example#1453)

## rustc-dev-guide

2 commits in 93422c21baca585dc88357ec886a48f6ddc7d665..09343d6f921d2a07c66f8c41ec3d65bf1fa52556
2021-07-13 12:45:58 -0400 to 2021-07-26 00:37:28 +0200
- Fix typo in building/bootstrapping.md (rust-lang/rustc-dev-guide#1175)
- Link directly to stabilization report comments (rust-lang/rustc-dev-guide#1173)

## edition-guide

4 commits in af696ce8ea526445590ae0ca66a8128d2a95a69a..3710b0cae783d0bcd2b42452a63b081473f5970a
2021-07-20 11:38:03 -0400 to 2021-07-26 11:34:46 -0700
- Add more consistent headings and add a migration section to reserving-syntax (rust-lang/edition-guide#263)
- reserving-syntax.md: Expand and add detail (rust-lang/edition-guide#249)
- Fix typo in or-patterns section (rust-lang/edition-guide#262)
- Fix typo (rust-lang/edition-guide#261)
JohnTitor added a commit to JohnTitor/rust that referenced this issue Jul 27, 2021
Update books

## nomicon

1 commits in 7a13537f96af4b9b8e3ea296d6e5c3c7ab72ce9f..f51734eb5566c826b471977747ea3d7d6915bbe9
2021-07-05 23:34:47 -0400 to 2021-07-23 18:24:35 +0900
- Add cloning example for dot operator behaviour (rust-lang/nomicon#292)

## reference

3 commits in 82d75cf423e4a7824fb36e73ccb18519d6900610..3b7be075af5d6e402a18efff672a8a265b4596fd
2021-07-15 06:49:08 -0700 to 2021-07-26 13:20:11 -0700
- Fix typos + grammar (rust-lang/reference#1037)
- Expand on Unicode identifiers. (rust-lang/reference#1022)
- Remove incorrect apostrophe (rust-lang/reference#1076)

## book

17 commits in eac55314210519238652f12b30fec9daea61f7fe..a07036f864b37896b31eb996cd7aedb489f69a1f
2021-07-19 11:08:01 -0400 to 2021-07-26 20:19:46 -0400
- Set expectations a bit more realistically
- Snapshot of chapter 4 for nostarch
- A few small wording tweaks in ch 4
- Clarify that it's not stack/heap exactly that matters for copy/non copy, fixes rust-lang/book#2799
- Clarify a detail around move. Fixes rust-lang/book#2413.
- Clarify places that changed because of NLL. Fixes rust-lang/book#1939.
- nostarch ch3
- Small edits to chapter 3
-  (rust-lang/book#2797)
- Update ch03-03-how-functions-work.md: Pervasive -> Prevalent. (rust-lang/book#2796)
- Address loop labels and continue. Fixes rust-lang/book#1392.
- Clarify behavior of integer division. Fixes rust-lang/book#2248.
- Demonstrate how scope interacts with shadowing
- Add another cross-reference to the new unit type introduction
- Introduce the unit type with tuples. Fixes rust-lang/book#1933.
- Reword sentence to not have numbers separated only by a comma
- Link directly to other installation page. Fixes rust-lang/book#1609

## rust-by-example

1 commits in 1db6bb483cc87ad3b424d9aba764fe622960a1be..0dc9cd4e89f00cb5230f120e1a083916386e422b
2021-07-15 06:17:42 -0300 to 2021-07-23 09:14:27 -0300
- Grammatical mistake: Comparison as ... as the (rust-lang/rust-by-example#1453)

## rustc-dev-guide

2 commits in 93422c21baca585dc88357ec886a48f6ddc7d665..09343d6f921d2a07c66f8c41ec3d65bf1fa52556
2021-07-13 12:45:58 -0400 to 2021-07-26 00:37:28 +0200
- Fix typo in building/bootstrapping.md (rust-lang/rustc-dev-guide#1175)
- Link directly to stabilization report comments (rust-lang/rustc-dev-guide#1173)

## edition-guide

4 commits in af696ce8ea526445590ae0ca66a8128d2a95a69a..3710b0cae783d0bcd2b42452a63b081473f5970a
2021-07-20 11:38:03 -0400 to 2021-07-26 11:34:46 -0700
- Add more consistent headings and add a migration section to reserving-syntax (rust-lang/edition-guide#263)
- reserving-syntax.md: Expand and add detail (rust-lang/edition-guide#249)
- Fix typo in or-patterns section (rust-lang/edition-guide#262)
- Fix typo (rust-lang/edition-guide#261)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants