Skip to content

Commit ebdace9

Browse files
committed
Drop the 2024 temporary scope discussion
The reference isn't intended to have guide-like material. Most of this should be covered in the edition guide.
1 parent cd7f8a8 commit ebdace9

File tree

1 file changed

+0
-91
lines changed

1 file changed

+0
-91
lines changed

src/destructors.md

-91
Original file line numberDiff line numberDiff line change
@@ -262,97 +262,6 @@ match PrintOnDrop("Matched value in final expression") {
262262
}
263263
```
264264

265-
#### Changes to temporary scopes by Edition 2024
266-
267-
Edition 2024 introduces two changes to the language regarding temporary scopes.
268-
First, temporary values generated from evaluating the pattern-matching condition
269-
of `if let` will be dropped earlier in general.
270-
271-
```rust,edition2024
272-
struct Droppy(u8);
273-
impl Droppy {
274-
fn get(&self) -> Option<&u8> {
275-
Some(&self.0)
276-
}
277-
}
278-
impl Drop for Droppy {
279-
fn drop(&mut self) {
280-
println!("drop({})", self.0);
281-
}
282-
}
283-
284-
fn call(x: &u8, y: u8, z: &u8) {
285-
println!("call with {x} {y} {z}");
286-
}
287-
288-
let x1 = 0;
289-
let x2 = 3;
290-
291-
call(
292-
if let Some(x) = Droppy(0).get() {
293-
println!("if let consequence");
294-
&x1
295-
} else {
296-
&x2
297-
},
298-
{
299-
let y = Droppy(1);
300-
*y.get().unwrap()
301-
},
302-
Droppy(2).get().unwrap()
303-
);
304-
println!("call ended");
305-
```
306-
307-
This program will print the following.
308-
309-
```text
310-
if let consequence
311-
drop(0)
312-
drop(1)
313-
call with 0 1 2
314-
drop(2)
315-
call ended
316-
```
317-
318-
In other words, `Droppy(0)` is dropped before `Droppy(1)` because its temporary scope is
319-
limited by Edition 2024 to the proper end of the `if let` expression.
320-
321-
Second, temporary values generated from evaluating the tail expression of a block
322-
or a function body will be dropped earlier than the local variable bindings.
323-
The following example demonstrates the Edition 2024 order of events that values
324-
and local variables are dropped.
325-
326-
```rust,edition2024
327-
struct Droppy(u8);
328-
impl Droppy {
329-
fn get(&self) -> Option<&u8> {
330-
Some(&self.0)
331-
}
332-
}
333-
impl Drop for Droppy {
334-
fn drop(&mut self) {
335-
println!("drop({})", self.0);
336-
}
337-
}
338-
339-
fn call() -> u8 {
340-
let x = Droppy(0);
341-
*x.get() + *Droppy(1).get()
342-
}
343-
344-
call();
345-
```
346-
347-
The print-out from this program will be the following.
348-
349-
```text
350-
drop(1)
351-
drop(0)
352-
```
353-
354-
In other words, `Droppy(1)` is dropped earlier than `x`.
355-
356265
### Operands
357266

358267
r[destructors.scope.operands]

0 commit comments

Comments
 (0)