Skip to content

Commit

Permalink
deploy: a6b4d66
Browse files Browse the repository at this point in the history
  • Loading branch information
scPointer committed Jul 9, 2024
1 parent e8827bb commit 035dff2
Show file tree
Hide file tree
Showing 3 changed files with 3 additions and 3 deletions.
2 changes: 1 addition & 1 deletion _sources/chapter4/3sv39-implementation-1.rst.txt
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
2 changes: 1 addition & 1 deletion chapter4/3sv39-implementation-1.html
Original file line number Diff line number Diff line change
Expand Up @@ -470,7 +470,7 @@ <h3>地址相关的数据结构抽象与类型定义<a class="headerlink" href="
<p>一般而言,当我们为类型 <code class="docutils literal notranslate"><span class="pre">U</span></code> 实现了 <code class="docutils literal notranslate"><span class="pre">From&lt;T&gt;</span></code> Trait 之后,可以使用 <code class="docutils literal notranslate"><span class="pre">U::from(_:</span> <span class="pre">T)</span></code> 来从一个 <code class="docutils literal notranslate"><span class="pre">T</span></code> 类型的实例来构造一个 <code class="docutils literal notranslate"><span class="pre">U</span></code> 类型的实例;而当我们为类型 <code class="docutils literal notranslate"><span class="pre">U</span></code> 实现了 <code class="docutils literal notranslate"><span class="pre">Into&lt;T&gt;</span></code> Trait 之后,对于一个 <code class="docutils literal notranslate"><span class="pre">U</span></code> 类型的实例 <code class="docutils literal notranslate"><span class="pre">u</span></code> ,可以使用 <code class="docutils literal notranslate"><span class="pre">u.into()</span></code> 来将其转化为一个类型为 <code class="docutils literal notranslate"><span class="pre">T</span></code> 的实例。</p>
<p>当我们为 <code class="docutils literal notranslate"><span class="pre">U</span></code> 实现了 <code class="docutils literal notranslate"><span class="pre">From&lt;T&gt;</span></code> 之后,Rust 会自动为 <code class="docutils literal notranslate"><span class="pre">T</span></code> 实现 <code class="docutils literal notranslate"><span class="pre">Into&lt;U&gt;</span></code> Trait,因为它们两个本来就是在做相同的事情。因此我们只需相互实现 <code class="docutils literal notranslate"><span class="pre">From</span></code> 就可以相互 <code class="docutils literal notranslate"><span class="pre">From/Into</span></code> 了。</p>
<p>需要注意的是,当我们使用 <code class="docutils literal notranslate"><span class="pre">From</span></code> Trait 的 <code class="docutils literal notranslate"><span class="pre">from</span></code> 方法来构造一个转换后类型的实例的时候,<code class="docutils literal notranslate"><span class="pre">from</span></code> 的参数已经指明了转换前的类型,因而 Rust 编译器知道该使用哪个实现;而使用 <code class="docutils literal notranslate"><span class="pre">Into</span></code> Trait 的 <code class="docutils literal notranslate"><span class="pre">into</span></code> 方法来将当前类型转化为另一种类型的时候,它并没有参数,因而函数签名中并没有指出要转化为哪一个类型,则我们必须在其它地方 <em>显式</em> 指出目标类型。比如,当我们要将 <code class="docutils literal notranslate"><span class="pre">u.into()</span></code> 绑定到一个新变量 <code class="docutils literal notranslate"><span class="pre">t</span></code> 的时候,必须通过 <code class="docutils literal notranslate"><span class="pre">let</span> <span class="pre">t:</span> <span class="pre">T</span></code> 显式声明 <code class="docutils literal notranslate"><span class="pre">t</span></code> 的类型;又或是将 <code class="docutils literal notranslate"><span class="pre">u.into()</span></code> 的结果作为参数传给某一个函数,那么由于这个函数的函数签名中指出了传入位置的参数的类型,所以 Rust 编译器也就明确知道转换的类型。</p>
<p>请注意,解引用 <code class="docutils literal notranslate"><span class="pre">Deref</span></code> Trait 是 Rust 编译器唯一允许的一种隐式类型转换,而对于其他的类型转换,我们必须手动调用类型转化方法或者是显式给出转换前后的类型。这体现了 Rust 的类型安全特性,在 C/C++ 中并不是如此,比如两个不同的整数/浮点数类型进行二元运算的时候,编译器经常要先进行隐式类型转换使两个操作数类型相同,而后再进行运算,导致了很多数值溢出或精度损失问题。Rust 不会进行这种隐式类型转换,它会在编译期直接报错,提示两个操作数类型不匹配。</p>
<p>请注意,解引用 <code class="docutils literal notranslate"><span class="pre">Deref</span></code> Trait 是 Rust 编译器允许的一种隐式类型转换,而对于大部分类型转换,我们必须手动调用类型转化方法或者是显式给出转换前后的类型。这体现了 Rust 的类型安全特性,在 C/C++ 中并不是如此,比如两个不同的整数/浮点数类型进行二元运算的时候,编译器经常要先进行隐式类型转换使两个操作数类型相同,而后再进行运算,导致了很多数值溢出或精度损失问题。Rust 不会进行这种隐式类型转换,它会在编译期直接报错,提示两个操作数类型不匹配。</p>
</div>
<p>其次,地址和页号之间可以相互转换。我们这里仍以物理地址和物理页号之间的转换为例:</p>
<div class="highlight-rust notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="c1">// os/src/mm/address.rs</span>
Expand Down
2 changes: 1 addition & 1 deletion searchindex.js

Large diffs are not rendered by default.

0 comments on commit 035dff2

Please sign in to comment.