@@ -446,16 +446,16 @@ It gives us this error:
446
446
error: aborting due to previous error
447
447
` ` `
448
448
449
- It mentions that " captured outer variable in an ` FnMut ` closure " .
450
- Because we declared the closure as a moving closure, and it referred
451
- to ` numbers ` , the closure will try to take ownership of the
452
- vector. But the closure itself is created in a loop, and hence we will
453
- actually create three closures, one for every iteration of the
454
- loop. This means that all three of those closures would try to own
455
- ` numbers ` , which is impossible -- ` numbers` must have just one
456
- owner. Rust detects this and gives us the error: we claim that
457
- ` numbers ` has ownership, but our code tries to make three owners. This
458
- may cause a safety problem, so Rust disallows it.
449
+ This is a little confusing because there are two closures here: the one passed
450
+ to ` map ` , and the one passed to ` thread::scoped ` . In this case, the closure for
451
+ ` thread::scoped ` is attempting to reference ` numbers ` , a ` Vec < i 32> ` . This
452
+ closure is a ` FnOnce ` closure, as that’s what ` thread::scoped ` takes as an
453
+ argument. ` FnOnce ` closures take ownership of their environment. That’s fine,
454
+ but there’s one detail: because of ` map ` , we’re going to make three of these
455
+ closures. And since all three try to take ownership of ` numbers` , that would be
456
+ a problem. That’s what it means by ‘cannot move out of captured outer
457
+ variable’: our ` thread::scoped ` closure wants to take ownership, and it can’t,
458
+ because the closure for ` map ` won’t let it.
459
459
460
460
What to do here? Rust has two types that helps us: ` Arc< T> ` and ` Mutex< T> ` .
461
461
* Arc* stands for " atomically reference counted" . In other words, an Arc will
0 commit comments