mirror of
https://github.com/KaiserY/trpl-zh-cn
synced 2024-11-09 08:51:18 +08:00
commit
fc11944f01
@ -277,7 +277,7 @@ error[E0507]: cannot move out of borrowed content
|
|||||||
|
|
||||||
错误的核心是`cannot move out of type [T], a non-copy array`,对于非泛型版本的`largest`函数,我们只尝试了寻找最大的`i32`和`char`。正如第四章讨论过的,像`i32`和`char`这样的类型是已知大小的并可以储存在栈上,所以他们实现了`Copy` trait。当我们将`largest`函数改成使用泛型后,现在`list`参数的类型就有可能是没有实现`Copy` trait 的,这意味着我们可能不能将`list[0]`的值移动到`largest`变量中。
|
错误的核心是`cannot move out of type [T], a non-copy array`,对于非泛型版本的`largest`函数,我们只尝试了寻找最大的`i32`和`char`。正如第四章讨论过的,像`i32`和`char`这样的类型是已知大小的并可以储存在栈上,所以他们实现了`Copy` trait。当我们将`largest`函数改成使用泛型后,现在`list`参数的类型就有可能是没有实现`Copy` trait 的,这意味着我们可能不能将`list[0]`的值移动到`largest`变量中。
|
||||||
|
|
||||||
如果只想对实现了`Copy`的类型调用这些带啊吗,可以在`T`的 trait bounds 中增加`Copy`!列表 10-15 中展示了一个可以编译的泛型版本的`largest`函数的完整代码,只要传递给`largest`的 slice 值的类型实现了`PartialOrd`和`Copy`这两个 trait,例如`i32`和`char`:
|
如果只想对实现了`Copy`的类型调用这些代码,可以在`T`的 trait bounds 中增加`Copy`!列表 10-15 中展示了一个可以编译的泛型版本的`largest`函数的完整代码,只要传递给`largest`的 slice 值的类型实现了`PartialOrd`和`Copy`这两个 trait,例如`i32`和`char`:
|
||||||
|
|
||||||
<span class="filename">Filename: src/main.rs</span>
|
<span class="filename">Filename: src/main.rs</span>
|
||||||
|
|
||||||
@ -317,4 +317,4 @@ function that works on any generic type that implements the `PartialOrd` and
|
|||||||
|
|
||||||
trait 和 trait bounds 让我们使用泛型类型参数来减少重复,并仍然能够向编译器明确指定泛型类型需要拥有哪些行为。因为我们向编译器提供了 trait bounds 信息,它就可以检查代码中所用到的具体类型是否提供了正确的行为。在动态类型语言中,如果我们尝试调用一个类型并没有实现的方法,会在运行时出现错误。Rust 将这些错误移动到了编译时,甚至在代码能够运行之前就强迫我们修复错误。另外,我们也无需编写运行时检查行为的代码,因为在编译时就已经检查过了,这样相比其他那些不愿放弃泛型灵活性的语言有更好的性能。
|
trait 和 trait bounds 让我们使用泛型类型参数来减少重复,并仍然能够向编译器明确指定泛型类型需要拥有哪些行为。因为我们向编译器提供了 trait bounds 信息,它就可以检查代码中所用到的具体类型是否提供了正确的行为。在动态类型语言中,如果我们尝试调用一个类型并没有实现的方法,会在运行时出现错误。Rust 将这些错误移动到了编译时,甚至在代码能够运行之前就强迫我们修复错误。另外,我们也无需编写运行时检查行为的代码,因为在编译时就已经检查过了,这样相比其他那些不愿放弃泛型灵活性的语言有更好的性能。
|
||||||
|
|
||||||
这里还有一种泛型,我们一直在使用它甚至都没有察觉它的存在,这就是**生命周期**(*lifetimes*)。不同于其他泛型帮助我们确保类型拥有期望的行为,生命周期则有助于确保引用在我们需要他们的时候一直有效。让我们学习生命周期是如何做到这些的。
|
这里还有一种泛型,我们一直在使用它甚至都没有察觉它的存在,这就是**生命周期**(*lifetimes*)。不同于其他泛型帮助我们确保类型拥有期望的行为,生命周期则有助于确保引用在我们需要他们的时候一直有效。让我们学习生命周期是如何做到这些的。
|
||||||
|
Loading…
Reference in New Issue
Block a user