<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 模塊 從Lua5.1版本開始,就對模塊和包添加了新的支持,可是使用require和module來定義和使用模塊和包。require用于使用模塊,module用于創建模塊。簡單的說,一個模塊就是一個程序庫,可以通過require來加載。然后便得到了一個全局變量,表示一個table。這個table就像是一個命名空間,其內容就是模塊中導出的所有東西,比如函數和常量,一個符合規范的模塊還應使require返回這個table。 #### require函數 Lua提供了一個名為require的函數用來加載模塊。要加載一個模塊,只需要簡單地調用require "file"就可以了,file指模塊所在的文件名。這個調用會返回一個由模塊函數組成的table,并且還會定義一個包含該table的全局變量。 在Lua中創建一個模塊最簡單的方法是:創建一個table,并將所有需要導出的函數放入其中,最后返回這個table就可以了。相當于將導出的函數作為table的一個字段,在Lua中函數是第一類值,提供了天然的優勢。下面寫一個實現復數加法和減法的模塊。 > 把下面的代碼保存在文件complex.lua中。 ~~~ local _M = {} -- 局部變量,模塊名稱 function _M.new(r, i) return {r = r, i = i} end _M.i = _M.new(0, 1) -- 定義一個table型常量i function _M.add(c1, c2) --復數加法 return _M.new(c1.r + c2.r, c1.i + c2.i) end function _M.sub(c1, c2) --復數減法 return _M.new(c1.r - c2.r, c1.i - c2.i) end return _M -- 返回模塊的table ~~~ > 把下面代碼保存在文件main.lua中,然后執行main.lua,調用上述模塊。 ~~~ local complex = require "complex" local com1 = complex.new(0, 1) local com2 = complex.new(1, 2) local ans = complex.add(com1, com2) print(ans.r, ans.i) -->output 1 3 ~~~ 下面定義和使用模塊的習慣是極不好的。用這種定義模塊是非常危險的,因為引入了全局變量,在引用模塊時非常容易覆蓋外面的變量。為了引起讀者的注意,每行代碼前加了一個'?'。 > 把下面的代碼保存在文件complex.lua中。(執行代碼要去掉前面的'?') ~~~ ? complex = {} -- 全局變量,模塊名稱 ? function complex.new(r, i) ? return {r = r, i = i} ? end ? complex.i =complex.new(0, 1) -- 定義一個table型常量i ? function complex.add(c1, c2) --復數加法 ? return M.new(c1.r + c2.r, c1.i + c2.i) ? end ? function complex.sub(c1, c2) --復數減法 ? return M.new(c1.r - c2.r, c1.i - c2.i) ? end ? return complex -- 返回模塊的table ~~~ > 把下面代碼保存在文件main.lua中,然后執行main.lua,調用上述模塊。(執行代碼要去掉前面的'?') ~~~ ? require "complex" ? local com1 = complex.new(0, 1) ? local com2 = complex.new(1, 2) ? local ans = complex.add(com1, com2) ? print(ans.r, ans.i) -->output 1 3 ~~~ #### module函數(不推薦使用) 在Lua5.1中提供了一個新函數module。module(..., package.seeall) 這一行代碼會創建一個新的table,將其賦予給模塊名對應的全局字段和loaded table,還會將這個table設為主程序塊的環境,并且模塊還能提供外部訪問。但這種寫法是不提倡的,官方給出了兩點原因: 1. package.seeall 這種方式破壞了模塊的高內聚,原本引入"filename"模塊只想調用它的內部函數,但是它卻可以讀寫全局屬性,例如 "filename.os"。 1. module 函數壓棧操作引發的副作用,污染了全局環境變量。例如 module("filename") 會創建一個 filename 的 table*,并將這個 table 注入全局環境變量中,這樣使得沒有引用它的文件也能調用 filename 模塊的方法。 > 把mod1.lua文件改成如下代碼。 ~~~ module(..., package.seeall) function new(r, i) return {r = r, i = i} end local i = new(0, 1) function add(c1, c2) return new(c1.r + c2.r, c1.i + c2.i) end function sub(c1, c2) return new(c1.r - c2.r, c1.i - c2.i) end function update( ) A = A + 1 end getmetatable(mod1).__newindex = function (table, key, val) --防止模塊更改全局變量 error('attempt to write to undeclared variable "' .. key .. '": ' .. debug.traceback()) end ~~~ > 把main.lua文件改成如下代碼。 ~~~ A = 2 require "mod1" local com1 = mod1.new(0, 1) local com2 = mod1.new(1, 2) mod1.update() local ans = mod1.add(com1, com2) print(ans.r, ans.i) ~~~ 運行main.lua,會報錯: ~~~ lua: .\mod1.lua:22: attempt to write to undeclared variable "A": stack traceback: .\mod1.lua:22: in function <.\mod1.lua:21> .\mod1.lua:18: in function 'update' my.lua:9: in main chunk [C]: ? stack traceback: [C]: in function 'error' .\mod1.lua:22: in function <.\mod1.lua:21> .\mod1.lua:18: in function 'update' my.lua:9: in main chunk [C]: ? ~~~ > 把mod1.lua文件改成如下代碼。 ~~~ module(..., package.seeall) function new(r, i) return {r = r, i = i} end local i = new(0, 1) function add(c1, c2) return new(c1.r + c2.r, c1.i + c2.i) end function sub(c1, c2) return new(c1.r - c2.r, c1.i - c2.i) end function update( ) A = A + 1 end ~~~ 運行main.lua,得到結果: ~~~ 1 3 ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看