mirror of
https://github.com/KaiserY/trpl-zh-cn
synced 2025-04-16 08:28:09 +08:00
Merge remote-tracking branch 'official/master'
This commit is contained in:
commit
b3f88e7ebc
@ -111,7 +111,7 @@ fn main() {
|
||||
|
||||
你刚刚运行了一个新创建的程序,那么让我们检查此过程中的每一个步骤。
|
||||
|
||||
在运行 Rust 程序之前,必须先使用 Rust 编辑器编译它,即输入 `rustc` 命令并传入源文件名称,如下:
|
||||
在运行 Rust 程序之前,必须先使用 Rust 编译器编译它,即输入 `rustc` 命令并传入源文件名称,如下:
|
||||
|
||||
```text
|
||||
$ rustc main.rs
|
||||
|
@ -328,7 +328,7 @@ fn run(config: Config) -> Result<(), Box<dyn Error>> {
|
||||
|
||||
<span class="caption">示例 12-12:修改 `run` 函数返回 `Result`</span>
|
||||
|
||||
这里我们做出了三个明显的修改。首先,将 `run` 函数的返回类型变为 `Result<(), Box<Error>>`。之前这个函数返回 unit 类型 `()`,现在它仍然保持作为 `Ok` 时的返回值。
|
||||
这里我们做出了三个明显的修改。首先,将 `run` 函数的返回类型变为 `Result<(), Box<dyn Error>>`。之前这个函数返回 unit 类型 `()`,现在它仍然保持作为 `Ok` 时的返回值。
|
||||
|
||||
对于错误类型,使用了 **trait 对象** `Box<dyn Error>`(在开头使用了 `use` 语句将 `std::error::Error` 引入作用域)。第十七章会涉及 trait 对象。目前只需知道 `Box<dyn Error>` 意味着函数会返回实现了 `Error` trait 的类型,不过无需指定具体将会返回的值的类型。这提供了在不同的错误场景可能有不同类型的错误返回值的灵活性。这也就是 `dyn`,它是 “动态的”(“dynamic”)的缩写。
|
||||
|
||||
|
@ -97,6 +97,6 @@ impl AveragedCollection {
|
||||
> 很多人将多态描述为继承的同义词。不过它是一个有关可以用于多种类型的代码的更广泛的概念。对于继承来说,这些类型通常是子类。
|
||||
> Rust 则通过泛型来使得对多个不同类型的抽象成为可能,并通过 trait bounds 加强对这些类型所必须提供的内容的限制。这有时被称为 *bounded parametric polymorphism*。
|
||||
|
||||
近来继承作为一种语言设计的解决方案在很多语言中失宠了,因为其时常带有共享多于所需的代码的风险。子类不应总是共享其父类的多有特征,但是继承却始终如此。如此会使程序设计更为不灵活,并引入无意义的子类方法调用,或由于方法实际并不适用于子类而造成错误的可能性。某些语言还只允许子类继承一个父类,进一步限制了程序设计的灵活性。
|
||||
近来继承作为一种语言设计的解决方案在很多语言中失宠了,因为其时常带有共享多于所需的代码的风险。子类不应总是共享其父类的所有特征,但是继承却始终如此。如此会使程序设计更为不灵活,并引入无意义的子类方法调用,或由于方法实际并不适用于子类而造成错误的可能性。某些语言还只允许子类继承一个父类,进一步限制了程序设计的灵活性。
|
||||
|
||||
因为这些原因,Rust 选择了一个不同的途径,使用 trait 对象替代继承。让我们看一下 Rust 中的 trait 对象是如何实现多态的。
|
||||
|
Loading…
Reference in New Issue
Block a user