Skip to content

Commit

Permalink
deploy: 456d458
Browse files Browse the repository at this point in the history
  • Loading branch information
weihanglo committed Feb 9, 2024
1 parent 3ea320d commit e59700f
Show file tree
Hide file tree
Showing 4 changed files with 8 additions and 8 deletions.
6 changes: 3 additions & 3 deletions ch19-05-macros.html
Original file line number Diff line number Diff line change
Expand Up @@ -151,8 +151,8 @@ <h3 id="巨集與函式的差異"><a class="header" href="#巨集與函式的差
<p>基本上,巨集是一種透過寫程式碼來產生其他程式碼的手段,又稱作<strong>超程式設計</strong>(metaprogramming)。像是在附錄 C,我們探討的 <code>derive</code> 屬性,這個屬性會替你產生多種特徵的實作。還有在整本書中到處使用 <code>println!</code><code>vec!</code> 兩巨集。以上這些巨集都會<strong>展開</strong>來,產生比你自己手寫的還要多的程式碼。</p>
<p>超程式設計對減少撰寫和維護的程式碼量非常有幫助,這和函式扮演的角色相同,然而,巨集具有函式沒有的特殊本事。</p>
<p>一個函式簽名必須宣告該函式需要的參數型別與數量。反觀巨集可以接收變動數量的參數:我們可以用一個參數呼叫 <code>println!(&quot;hello&quot;)</code> ,也可以是兩個參數的 <code>println!(&quot;hello {}&quot;, name)</code>。另外,巨集會在編譯器開始翻譯程式碼的意義之前展開。例如可以使用巨集實作一個特徵。這種事函式便無法做到,因為函式會在執行期呼叫,而特徵需要在編譯期就實作。</p>
<p>選擇實作巨集而不用函式也有缺點,巨集的定義比函式更加複雜,因為你是在寫 Rust 的程式碼。就是因為這種間接迂迴的關係,一般情況下,相較於函式來說巨集的定義都更加難以閱讀、理解與維護。</p>
<p>另一個巨集和函式之間的重要的的差異,在一個檔案中想呼叫巨集,必須在作用域(scope)內定義或是將巨集帶到這個作用域,而反過來函式可以在任何地方定義與呼叫。</p>
<p>選擇實作巨集而不用函式也有缺點,巨集的定義比函式更加複雜,因為你是在寫 Rust 的程式碼來生成 Rust 的程式碼。就是因為這種間接迂迴的關係,一般情況下,相較於函式來說巨集的定義都更加難以閱讀、理解與維護。</p>
<p>另一個巨集和函式之間的重要差異,在一個檔案中想呼叫巨集,必須在作用域(scope)內定義或是將巨集帶到這個作用域,而反過來函式可以在任何地方定義與呼叫。</p>
<h3 id="使用-macro_rules-宣告式巨集做普通的超程式設計"><a class="header" href="#使用-macro_rules-宣告式巨集做普通的超程式設計">使用 <code>macro_rules!</code> 宣告式巨集做普通的超程式設計</a></h3>
<p>Rust 中最廣泛使用的巨集形式非<strong>宣告式巨集</strong>莫屬。這種巨集有時也稱為「巨集為例(macros by example)」、「<code>macro_rules!</code>」,或是直白的「巨集」。宣告式巨集的核心就是賦予你寫些類似 Rust <code>match</code> 表達式的東西。在第六章我們聊了 <code>match</code> 表達式是一種流程控制結構,會拿一個表達式,將其結果值與其他模式作比較,並執行匹配模式對應的程式碼。巨集同樣會拿一個值,與模式相比較,而這個模式又與特定程式碼相關聯:這種情況會是,傳入巨集的值就是一字一字刻出來 Rust 原始碼,而所謂模式則是比較原始碼的結構,當原始碼與模式相匹配,就會帶入與模式關聯的這段特定程式碼,取代原先傳入巨集的原始碼。這些都發生在編譯的期間。</p>
<p>你可以透過 <code>macro_rules!</code> 定義一個巨集。讓我們藉著閱讀 <code>vec!</code> 的定義來探索如何使用 <code>macro_rules!</code>。第八章我們介紹了如何使用 <code>vec!</code> 巨集來建立含有特定值的向量。例如,下面的巨集會建立帶著三個整數的新向量:</p>
Expand All @@ -161,7 +161,7 @@ <h3 id="使用-macro_rules-宣告式巨集做普通的超程式設計"><a class=
</span>let v: Vec&lt;u32&gt; = vec![1, 2, 3];
<span class="boring">}
</span></code></pre></pre>
<p>我們也可利用 <code>vec!</code> 巨集產生兩個整數的向量或是五個字串的 切片。因為不能預先得知這些值的數量,所以我們無法透過函式做到這件事。</p>
<p>我們也可利用 <code>vec!</code> 巨集產生兩個整數的向量或是五個字串的切片。因為不能預先得知這些值的數量,所以我們無法透過函式做到這件事。</p>
<p>範例 19-28 展示了稍微簡化過的 <code>vec!</code> 巨集定義。</p>
<p><span class="filename">檔案名稱:src/lib.rs</span></p>
<pre><code class="language-rust noplayground">#[macro_export]
Expand Down
6 changes: 3 additions & 3 deletions print.html
Original file line number Diff line number Diff line change
Expand Up @@ -16392,8 +16392,8 @@ <h3 id="巨集與函式的差異"><a class="header" href="#巨集與函式的差
<p>基本上,巨集是一種透過寫程式碼來產生其他程式碼的手段,又稱作<strong>超程式設計</strong>(metaprogramming)。像是在附錄 C,我們探討的 <code>derive</code> 屬性,這個屬性會替你產生多種特徵的實作。還有在整本書中到處使用 <code>println!</code> 和 <code>vec!</code> 兩巨集。以上這些巨集都會<strong>展開</strong>來,產生比你自己手寫的還要多的程式碼。</p>
<p>超程式設計對減少撰寫和維護的程式碼量非常有幫助,這和函式扮演的角色相同,然而,巨集具有函式沒有的特殊本事。</p>
<p>一個函式簽名必須宣告該函式需要的參數型別與數量。反觀巨集可以接收變動數量的參數:我們可以用一個參數呼叫 <code>println!(&quot;hello&quot;)</code> ,也可以是兩個參數的 <code>println!(&quot;hello {}&quot;, name)</code>。另外,巨集會在編譯器開始翻譯程式碼的意義之前展開。例如可以使用巨集實作一個特徵。這種事函式便無法做到,因為函式會在執行期呼叫,而特徵需要在編譯期就實作。</p>
<p>選擇實作巨集而不用函式也有缺點,巨集的定義比函式更加複雜,因為你是在寫 Rust 的程式碼。就是因為這種間接迂迴的關係,一般情況下,相較於函式來說巨集的定義都更加難以閱讀、理解與維護。</p>
<p>另一個巨集和函式之間的重要的的差異,在一個檔案中想呼叫巨集,必須在作用域(scope)內定義或是將巨集帶到這個作用域,而反過來函式可以在任何地方定義與呼叫。</p>
<p>選擇實作巨集而不用函式也有缺點,巨集的定義比函式更加複雜,因為你是在寫 Rust 的程式碼來生成 Rust 的程式碼。就是因為這種間接迂迴的關係,一般情況下,相較於函式來說巨集的定義都更加難以閱讀、理解與維護。</p>
<p>另一個巨集和函式之間的重要差異,在一個檔案中想呼叫巨集,必須在作用域(scope)內定義或是將巨集帶到這個作用域,而反過來函式可以在任何地方定義與呼叫。</p>
<h3 id="使用-macro_rules-宣告式巨集做普通的超程式設計"><a class="header" href="#使用-macro_rules-宣告式巨集做普通的超程式設計">使用 <code>macro_rules!</code> 宣告式巨集做普通的超程式設計</a></h3>
<p>Rust 中最廣泛使用的巨集形式非<strong>宣告式巨集</strong>莫屬。這種巨集有時也稱為「巨集為例(macros by example)」、「<code>macro_rules!</code>」,或是直白的「巨集」。宣告式巨集的核心就是賦予你寫些類似 Rust <code>match</code> 表達式的東西。在第六章我們聊了 <code>match</code> 表達式是一種流程控制結構,會拿一個表達式,將其結果值與其他模式作比較,並執行匹配模式對應的程式碼。巨集同樣會拿一個值,與模式相比較,而這個模式又與特定程式碼相關聯:這種情況會是,傳入巨集的值就是一字一字刻出來 Rust 原始碼,而所謂模式則是比較原始碼的結構,當原始碼與模式相匹配,就會帶入與模式關聯的這段特定程式碼,取代原先傳入巨集的原始碼。這些都發生在編譯的期間。</p>
<p>你可以透過 <code>macro_rules!</code> 定義一個巨集。讓我們藉著閱讀 <code>vec!</code> 的定義來探索如何使用 <code>macro_rules!</code>。第八章我們介紹了如何使用 <code>vec!</code> 巨集來建立含有特定值的向量。例如,下面的巨集會建立帶著三個整數的新向量:</p>
Expand All @@ -16402,7 +16402,7 @@ <h3 id="使用-macro_rules-宣告式巨集做普通的超程式設計"><a class=
</span>let v: Vec&lt;u32&gt; = vec![1, 2, 3];
<span class="boring">}
</span></code></pre></pre>
<p>我們也可利用 <code>vec!</code> 巨集產生兩個整數的向量或是五個字串的 切片。因為不能預先得知這些值的數量,所以我們無法透過函式做到這件事。</p>
<p>我們也可利用 <code>vec!</code> 巨集產生兩個整數的向量或是五個字串的切片。因為不能預先得知這些值的數量,所以我們無法透過函式做到這件事。</p>
<p>範例 19-28 展示了稍微簡化過的 <code>vec!</code> 巨集定義。</p>
<p><span class="filename">檔案名稱:src/lib.rs</span></p>
<pre><code class="language-rust noplayground">#[macro_export]
Expand Down
2 changes: 1 addition & 1 deletion searchindex.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion searchindex.json

Large diffs are not rendered by default.

0 comments on commit e59700f

Please sign in to comment.