Skip to content

Commit

Permalink
Merge pull request #208 from zjp-CN/ch4-rust-coercion
Browse files Browse the repository at this point in the history
fix: coercion 并不是只有 Deref 一种
  • Loading branch information
scPointer authored Jul 9, 2024
2 parents 97b5dc7 + eac2012 commit a6b4d66
Showing 1 changed file with 1 addition and 1 deletion.
2 changes: 1 addition & 1 deletion source/chapter4/3sv39-implementation-1.rst
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ SV39 多级页表的硬件机制

需要注意的是,当我们使用 ``From`` Trait 的 ``from`` 方法来构造一个转换后类型的实例的时候,``from`` 的参数已经指明了转换前的类型,因而 Rust 编译器知道该使用哪个实现;而使用 ``Into`` Trait 的 ``into`` 方法来将当前类型转化为另一种类型的时候,它并没有参数,因而函数签名中并没有指出要转化为哪一个类型,则我们必须在其它地方 *显式* 指出目标类型。比如,当我们要将 ``u.into()`` 绑定到一个新变量 ``t`` 的时候,必须通过 ``let t: T`` 显式声明 ``t`` 的类型;又或是将 ``u.into()`` 的结果作为参数传给某一个函数,那么由于这个函数的函数签名中指出了传入位置的参数的类型,所以 Rust 编译器也就明确知道转换的类型。

请注意,解引用 ``Deref`` Trait 是 Rust 编译器唯一允许的一种隐式类型转换,而对于其他的类型转换,我们必须手动调用类型转化方法或者是显式给出转换前后的类型。这体现了 Rust 的类型安全特性,在 C/C++ 中并不是如此,比如两个不同的整数/浮点数类型进行二元运算的时候,编译器经常要先进行隐式类型转换使两个操作数类型相同,而后再进行运算,导致了很多数值溢出或精度损失问题。Rust 不会进行这种隐式类型转换,它会在编译期直接报错,提示两个操作数类型不匹配。
请注意,解引用 ``Deref`` Trait 是 Rust 编译器允许的一种隐式类型转换,而对于大部分类型转换,我们必须手动调用类型转化方法或者是显式给出转换前后的类型。这体现了 Rust 的类型安全特性,在 C/C++ 中并不是如此,比如两个不同的整数/浮点数类型进行二元运算的时候,编译器经常要先进行隐式类型转换使两个操作数类型相同,而后再进行运算,导致了很多数值溢出或精度损失问题。Rust 不会进行这种隐式类型转换,它会在编译期直接报错,提示两个操作数类型不匹配。

其次,地址和页号之间可以相互转换。我们这里仍以物理地址和物理页号之间的转换为例:

Expand Down

0 comments on commit a6b4d66

Please sign in to comment.