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

Add a short discussion of shadowing and ownership in ch. 04 #4048

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
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

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
[package]
name = "ownership"
version = "0.1.0"
edition = "2021"

[dependencies]
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
fn main() {
// ANCHOR: here
let s = String::from("hello");
let s = String::from("ahoy");

println!("{s}, world!");
// ANCHOR_END: here
}
20 changes: 20 additions & 0 deletions src/ch04-01-what-is-ownership.md
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,26 @@ In addition, there’s a design choice that’s implied by this: Rust will never
automatically create “deep” copies of your data. Therefore, any *automatic*
copying can be assumed to be inexpensive in terms of runtime performance.

#### Scope and Shadowing

The inverse of this is true for the relationship between scoping, ownership, and
memory being freed via the `drop` function as well. Back in our discussion of
[Shadowing][shadowing], we noted that when you define a new variable with the
same name as an existing variable, it shadows the old variable. This is another
way that a variable can go out of scope.

Consider this code, for example:

```rust
{{#rustdoc_include ../listings/ch04-understanding-ownership/no-listing-04b-shadowing/src/main.rs:here}}
```

We initially declare a variable `s` and bind it to a `String` with the value
`"hello"`. Then we immediately declare a new value `s`, which is a `String` with
the value `"ahoy"`. The second declaration shadows the first one, so it
immediately goes out of scope and its memory is freed. When we print the value
at the end, it will be `"ahoy, world!"`.
Comment on lines +373 to +377
Copy link
Contributor Author

Choose a reason for hiding this comment

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

This is wrong! I reread the Reference section on this (it had been a few years) along with a couple other relevant resources, and the String with "hello" becomes unavailable for anyone else to access, because there is no name pointing to it, but it will go out of scope at the end of the block, just like normal. (See this playground.)

This is subtle enough, and gets into enough of the details around how Drop works, that I think we should absolutely not put it here, and frankly I don’t think we should cover it explicitly in the book.

(A data point: I have been writing Rust off and on for the last 9 years, and I have never thought about this.)

Net, I am closing this, along with the original issue!


<!-- Old heading. Do not remove or links may break. -->
<a id="ways-variables-and-data-interact-clone"></a>

Expand Down
Loading