import{_ as s,c as i,o as a,a4 as n}from"./chunks/framework.Cy9JvDAg.js";const c=JSON.parse('{"title":"3.4.12 - 表达式列表、多重返回以及相应调整","description":"","frontmatter":{"title":"3.4.12 - 表达式列表、多重返回以及相应调整","footer":true,"lastUpdated":true,"outline":false},"headers":[],"relativePath":"3.4.12.md","filePath":"3.4.12.md"}'),h={name:"3.4.12.md"},l=n(`<h3 id="_3-4-12-表达式列表、多重返回以及相应调整" tabindex="-1">3.4.12 - 表达式列表、多重返回以及相应调整 <a class="header-anchor" href="#_3-4-12-表达式列表、多重返回以及相应调整" aria-label="Permalink to &quot;3.4.12 - 表达式列表、多重返回以及相应调整&quot;">​</a></h3><p>函数调用和可变参数表达式的结果都可以是多个值。这些表达式被称为<em>多重表达式（multires expressions）</em>。</p><p>当一个多重表达式被用作表达式列表的最后一个元素时，其所有的结果值都被添加到由表达式列表生成的值列表中。注意在表达式列表中的单一表达式也视为列表中的最后一个表达式（即单一列表）。</p><p>这些是Lua视为表达式列表的地方：</p><ul><li><strong>return</strong>语句，例如 return e1, e2, e3（参见<a href="/lua5.4-manual-zh/3.3.4.html">3.3.4</a>）。</li><li>表的构造语句，例如 {e1, e2, e3}（参见<a href="/lua5.4-manual-zh/3.4.9.html">3.4.9</a>）。</li><li>函数调用的形参，例如 foo(e1, e2, e3)（参见<a href="/lua5.4-manual-zh/3.4.10.html">3.4.10</a>）。</li><li>多重赋值语句，例如 a , b, c = e1, e2, e3（参见<a href="/lua5.4-manual-zh/3.3.3.html">3.3.3</a>）。</li><li>局部声明，例如 local a , b, c = e1, e2, e3（参见<a href="/lua5.4-manual-zh/3.3.7.html">3.3.7</a>）。</li><li><strong>for</strong>循环通用形式的初始化变量，例如 for k in e1, e2, e3 do ... end（参见<a href="/lua5.4-manual-zh/3.3.5.html">3.3.5</a>）。</li></ul><p>在后四种情况中，表达式列表的值列表已经会被<em>调整</em>到合适的长度：非可变参数函数的参数个数（参见<a href="/lua5.4-manual-zh/3.4.11.html">3.4.11</a>）、多重赋值和局部声明的变量个数、以及上述<strong>for</strong>循环通用形式中的那几个值的个数4。这里的<em>调整</em>遵循这些规则：如果存在多于所需要的值，那么额外的将被抛弃；如果所有的值比所需的少，那么会使用<strong>nil</strong>来扩展列表。当表达式列表最后也是个多重表达式时，此多重表达式的所有值将会在调整之前进入值列表。</p><p>当一个多重表达式在表达式列表中并不是最后一个元素时，或在一个被语法视为单一表达式的位置中，Lua会将表达式的结果列表调整为单个元素。举个特殊的例子，语法将单一表达式视作其在一对括号内；因此，在多重表达式外加上括号会直接强制生成单个结果。</p><p>我们很少在一个被语法视为单一表达式的地方使用多重表达式。（通常更简单的方式是在可变部分之前添加并使用常规参数。）当有这样的需求时，我们推荐将多重表达式赋值给一个单独的变量然后在此处使用。</p><p>这里是一些使用多重表达式的例子。无论如何，当构造语句中需要“第n个结果”然而并没有时，都使用<strong>nil</strong>。</p><div class="language-lua vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">lua</span><pre class="shiki shiki-themes github-light github-dark vp-code"><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(x, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">f</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">())      </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">-- 打印x和f()的所有结果</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(x, (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">f</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()))    </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">-- 打印x和f()的第一个结果</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">f</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(), x)      </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">-- 打印f()的第一个结果和x</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> +</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> f</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">())     </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">-- 打印f()的第一个结果加1</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">local</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> ...</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">      -- x为可变参数中的第一个值</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">x,y </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> ...</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">          -- x为可变参数中的第一个值</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">                   -- y为可变参数中的第二个值</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">x,y,z </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> w, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">f</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()     </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">-- x为可变参数中的第一个值</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">                   -- y为f()的第一个结果</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">                   -- z为f()的第二个结果</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">x,y,z </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> f</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()        </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">-- x为f()的第一个结果</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">                   -- y为f()的第二个结果</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">                   -- z为f()的第三个结果</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">x,y,z </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> f</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(), </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">g</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()   </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">-- x为f()的第一个结果</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">                   -- y为g()的第一个结果</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">                   -- z为g()的第二个结果</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">x,y,z </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">f</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">())      </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">-- x为f()的第一个结果，y和z都为nil</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> f</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()         </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">-- 返回f()的所有结果</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> x, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">...</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">      -- 返回x和所接收到的所有可变参数</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> x,y,</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">f</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()     </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">-- 返回x、y、以及f()的所有结果</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">f</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()}              </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">-- 创建一个列表，其中是f()的所有结果</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}              </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">-- 创建一个列表，其中是接收到的所有可变参数</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">f</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(), </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}           </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">-- 创建一个列表，其中是f()的第一个结果和数字5</span></span></code></pre></div>`,10),k=[l];function p(t,e,r,E,d,g){return a(),i("div",null,k)}const A=s(h,[["render",p]]);export{c as __pageData,A as default};
