|
|
@ -131,7 +131,7 @@ let add_one_v4 = |x| x + 1 ;
|
|
|
|
|
|
|
|
|
|
|
|
<span class="caption">示例 13-6:使用 `move` 来强制闭包为线程获取 `list` 的所有权</span>
|
|
|
|
<span class="caption">示例 13-6:使用 `move` 来强制闭包为线程获取 `list` 的所有权</span>
|
|
|
|
|
|
|
|
|
|
|
|
我们生成了一个新的线程,并给这个线程传递一个闭包作为参数来运行,闭包体打印出列表。在示例 13-4 中,闭包仅通过不可变引用捕获了 `list`,因为这是打印列表所需的最少的访问权限。这个例子中,尽管闭包体依然只需要不可变引用,我们还是在闭包定义前写上 `move` 关键字,以确保 `list` 被移动到闭包中。新线程可能在主线程剩余部分执行完前执行完,或者也可能主线程先执行完。如果主线程维护了 `list` 的所有权但却在新线程之前结束并且丢弃了 `list`,则在线程中的不可变引用将失效。因此,编译器要求 `list` 被移动到在新线程中运行的闭包中,这样引用就是有效的。试着移除 `move` 关键字,或者在闭包定义后在主线程中使用 `list`,看看你会得到什么编译器报错!
|
|
|
|
我们生成了一个新的线程,并给这个线程传递一个闭包作为参数来运行,闭包体打印出列表。在示例 13-4 中,闭包仅通过不可变引用捕获了 `list`,因为这是打印列表所需的最少的访问权限。这个例子中,尽管闭包体依然只需要不可变引用,我们还是在闭包定义前写上 `move` 关键字,以确保 `list` 被移动到闭包中。新线程可能在主线程剩余部分执行完前执行完,也可能在主线程执行完之后执行完。如果主线程维护了 `list` 的所有权但却在新线程之前结束并且丢弃了 `list`,则在线程中的不可变引用将失效。因此,编译器要求 `list` 被移动到在新线程中运行的闭包中,这样引用就是有效的。试着移除 `move` 关键字,或者在闭包定义后在主线程中使用 `list`,看看你会得到什么编译器报错!
|
|
|
|
|
|
|
|
|
|
|
|
<a id="storing-closures-using-generic-parameters-and-the-fn-traits"></a>
|
|
|
|
<a id="storing-closures-using-generic-parameters-and-the-fn-traits"></a>
|
|
|
|
<a id="limitations-of-the-cacher-implementation"></a>
|
|
|
|
<a id="limitations-of-the-cacher-implementation"></a>
|
|
|
|