diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 9f64e433..0f1107bc 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -37,6 +37,7 @@ - [`break` and `continue`](control-flow-basics/break-continue.md) - [Labels](control-flow-basics/break-continue/labels.md) - [Blocks and Scopes](control-flow-basics/blocks-and-scopes.md) + - [Scopes and Shadowing](control-flow-basics/blocks-and-scopes/scopes.md) - [Functions](control-flow-basics/functions.md) - [Macros](control-flow-basics/macros.md) - [Exercise: Collatz Sequence](control-flow-basics/exercise.md) diff --git a/src/control-flow-basics/blocks-and-scopes.md b/src/control-flow-basics/blocks-and-scopes.md index 76a1da0c..93400524 100644 --- a/src/control-flow-basics/blocks-and-scopes.md +++ b/src/control-flow-basics/blocks-and-scopes.md @@ -24,40 +24,9 @@ fn main() { If the last expression ends with `;`, then the resulting value and type is `()`. -## Scopes and Shadowing - -A variable's scope is limited to the enclosing block. - -You can shadow variables, both those from outer scopes and variables from the -same scope: - -```rust,editable -fn main() { - let a = 10; - println!("before: {a}"); - { - let a = "hello"; - println!("inner scope: {a}"); - - let a = true; - println!("shadowed in inner scope: {a}"); - } - - println!("after: {a}"); -} -``` -
- You can show how the value of the block changes by changing the last line in the block. For instance, adding/removing a semicolon or using a `return`. -- Show that a variable's scope is limited by adding a `b` in the inner block in - the last example, and then trying to access it outside that block. -- Shadowing is different from mutation, because after shadowing both variable's - memory locations exist at the same time. Both are available under the same - name, depending where you use it in the code. -- A shadowing variable can have a different type. -- Shadowing looks obscure at first, but is convenient for holding on to values - after `.unwrap()`.
diff --git a/src/control-flow-basics/blocks-and-scopes/scopes.md b/src/control-flow-basics/blocks-and-scopes/scopes.md new file mode 100644 index 00000000..d3ba4d3d --- /dev/null +++ b/src/control-flow-basics/blocks-and-scopes/scopes.md @@ -0,0 +1,35 @@ +# Scopes and Shadowing + +A variable's scope is limited to the enclosing block. + +You can shadow variables, both those from outer scopes and variables from the +same scope: + +```rust,editable +fn main() { + let a = 10; + println!("before: {a}"); + { + let a = "hello"; + println!("inner scope: {a}"); + + let a = true; + println!("shadowed in inner scope: {a}"); + } + + println!("after: {a}"); +} +``` + +
+ +- Show that a variable's scope is limited by adding a `b` in the inner block in + the last example, and then trying to access it outside that block. +- Shadowing is different from mutation, because after shadowing both variable's + memory locations exist at the same time. Both are available under the same + name, depending where you use it in the code. +- A shadowing variable can have a different type. +- Shadowing looks obscure at first, but is convenient for holding on to values + after `.unwrap()`. + +