diff --git a/listings/ch10-generic-types-traits-and-lifetimes/no-listing-01-calling-trait-method/src/main.rs b/listings/ch10-generic-types-traits-and-lifetimes/no-listing-01-calling-trait-method/src/main.rs index 0363b3e..d94ed0a 100644 --- a/listings/ch10-generic-types-traits-and-lifetimes/no-listing-01-calling-trait-method/src/main.rs +++ b/listings/ch10-generic-types-traits-and-lifetimes/no-listing-01-calling-trait-method/src/main.rs @@ -10,5 +10,5 @@ fn main() { repost: false, }; - println!("1 new social post: {}", post.summarize()); + println!("1 new post: {}", post.summarize()); } diff --git a/src/ch10-01-syntax.md b/src/ch10-01-syntax.md index 7fe27a0..19cb27e 100644 --- a/src/ch10-01-syntax.md +++ b/src/ch10-01-syntax.md @@ -131,7 +131,7 @@ enum Result { 这里在 `Point` 上定义了一个叫做 `x` 的方法用于返回字段 `x` 中数据的引用。 -注意必须在 `impl` 后面声明 `T`,这样就可以在 `Point` 上实现的方法中使用 `T` 了。通过在 `impl` 之后声明泛型 `T`,Rust 就知道 `Point` 的尖括号中的类型是泛型而不是具体类型。我们可以为泛型参数选择一个与结构体定义中声明的泛型参数所不同的名称,不过依照惯例使用了相同的名称。在声明泛型类型参数的 `impl` 中编写的方法将会定义在该类型的任何实例上,无论最终替换泛型类型参数的是何具体类型。(译者注:以示例 10-9 为例,`impl` 中声明了泛型类型参数 `T`,`x` 是编写在 `impl` 中的方法,`x` 方法将会定义在 `Point` 的任何实例上,无论最终替换泛型类型参数 `T` 的是何具体类型)。 +注意必须在 `impl` 后面声明 `T`,这样就可以在 `Point` 上实现的方法中使用 `T` 了。通过在 `impl` 之后声明泛型 `T`,Rust 就知道 `Point` 的尖括号中的类型是泛型而不是具体类型。我们可以为泛型参数选择一个与结构体定义中声明的泛型参数所不同的名称,不过依照惯例使用了相同的名称。如果你在`impl`中编写一个声明泛型类型的方法,那么该方法将在任何类型的实例上定义,无论最终用什么具体类型来替换泛型类型。(译者注:以示例 10-9 为例,`impl` 中声明了泛型类型参数 `T`,`x` 是编写在 `impl` 中的方法,`x` 方法将会定义在 `Point` 的任何实例上,无论最终替换泛型类型参数 `T` 的是何具体类型)。 定义方法时也可以为泛型指定限制(constraint)。例如,可以选择为 `Point` 实例实现方法,而不是为泛型 `Point` 实例。示例 10-10 展示了一个没有在 `impl` 之后(的尖括号)声明泛型的例子,这里使用了一个具体类型,`f32`: diff --git a/src/ch11-01-writing-tests.md b/src/ch11-01-writing-tests.md index 5e18167..2561c26 100644 --- a/src/ch11-01-writing-tests.md +++ b/src/ch11-01-writing-tests.md @@ -197,7 +197,7 @@ Cargo 编译并运行了测试。可以看到 `running 1 test` 这一行。下 需要注意的是,在一些语言和测试框架中,断言两个值相等的函数的参数被称为 `expected` 和 `actual`,而且指定参数的顺序非常重要。然而在 Rust 中,它们则叫做 `left` 和 `right`,同时指定期望的值和被测试代码产生的值的顺序并不重要。这个测试中的断言也可以写成 `assert_eq!(add_two(2), result)`,这时失败信息仍同样是 `` assertion failed: `(left == right)` ``。 -`assert_ne!` 宏在传递给它的两个值不相等时通过,而在相等时失败。当我们不确定值**会**是什么,不过能确定值绝对**不会**_ **是什么的时候,这个宏最有用处。例如,如果一个函数保证会以某种方式改变其输入,不过这种改变方式是由运行测试时是星期几来决定的,这时最好的断言可能就是函数的输出不等于其输入。 +`assert_ne!` 宏在传递给它的两个值不相等时通过,而在相等时失败。当我们不确定值**会**是什么,不过能确定值绝对**不会**是什么的时候,这个宏最有用处。例如,如果一个函数保证会以某种方式改变其输入,不过这种改变方式是由运行测试时是星期几来决定的,这时最好的断言可能就是函数的输出不等于其输入。 `assert_eq!` 和 `assert_ne!` 宏在底层分别使用了 `==` 和 `!=`。当断言失败时,这些宏会使用调试格式打印出其参数,这意味着被比较的值必须实现了 `PartialEq` 和 `Debug` trait。所有的基本类型和大部分标准库类型都实现了这些 trait。对于自定义的结构体和枚举,需要实现 `PartialEq` 才能断言它们的值是否相等。需要实现 `Debug` 才能在断言失败时打印它们的值。因为这两个 trait 都是派生 trait,如第五章示例 5-12 所提到的,通常可以直接在结构体或枚举上添加 `#[derive(PartialEq, Debug)]` 注解。附录 C [“可派生 trait”][derivable-traits] 中有更多关于这些和其他派生 trait 的详细信息。