Skip to content

Commit a6b4d66

Browse files
authored
Merge pull request #208 from zjp-CN/ch4-rust-coercion
fix: coercion 并不是只有 Deref 一种
2 parents 97b5dc7 + eac2012 commit a6b4d66

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

source/chapter4/3sv39-implementation-1.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ SV39 多级页表的硬件机制
123123

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

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

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

0 commit comments

Comments
 (0)