<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ## (1) 全局變量與環境 lua 中真正存儲全局變量的地方不是在 _G 里面,而是在setfenv(i,table)的table中,所有當前的全局變量都在這里面找,只不過在程序開始時lua會默認先設置一個變量 _G= 這個里面的table而已。所以在新設置環境后,如果還想找到之前的全局變量,通常需要附加上為新的table設置元表{_index=_G} 下面的幾個例子: ~~~ a=1 print(a) print(_G.a) --正常情況,輸出1,1 a=1 setfenv(1,{}) print(a) print(_G.a) --這時會出錯說找不到print,因為當前的全局變量表示空的,啥也找不到的 a=1 setfenv(1,{_G=_G}) _G.print(_G.a) print(a) --這時_G.print(_G.a)可以正常嗎,因為可以在新的table中找到一個叫_G的表,這個_G有之前的奈爾全局變量,但是下面的print(a)則找不到print,因為當前的table{_G=_G}沒有一個叫print的東西 local mt={__index=_G} local t={} setmetatable(t,mt) setfenv(1,t) print(a) print(_G.a) --這是正確輸出,因為新的全局表采用之前的表做找不到時的索引,原先的表里面存在print 、_G、 a這些東西 ~~~ **setfenv的第一個參數可以是當前的堆棧層次,如1代表當前代碼塊,2表調用當前的上一層,也可以是具體的那個函數名,表示在那個函數里。** 每個新創建的函數都將繼承創建它的那個函數的全局環境。 從 Lua 5.1 開始,Lua 加入了標準的模塊管理機制,可以把一些公用的代碼放在一個文件里,以 API 接口的形式在其他地方調用,有利于代碼的重用和降低代碼耦合度。 ### [](https://github.com/andycai/luaprimer/blob/master/02.md#3-創建模塊)(3) 創建模塊 其實 Lua 的模塊是由變量、函數等已知元素組成的 table,因此創建一個模塊很簡單,就是創建一個 table,然后把需要導出的常量、函數放入其中,最后返回這個 table 就行。格式如下: ~~~ -- 定義一個名為 module 的模塊 module = {} -- 定義一個常量 module.constant = "this is a constant" -- 定義一個函數 function module.func1() io.write("this is a public function!\n") end local function func2() print("this is a private function!") end function module.func3() func2() end return module ~~~ 由上可知,模塊的結構就是一個 table 的結構,因此可以像操作調用 table 里的元素那樣來操作調用模塊里的常量或函數。不過上面的 func2 聲明為程序塊的局部變量,即表示一個私有函數,因此是不能從外部訪問模塊里的這個私有函數,必須通過模塊里的共有函數來調用。 最后,把上面的模塊代碼保存為跟模塊名一樣的 lua 文件里(例如上面是 module.lua),那么一個自定義的模塊就創建成功。 ### [](https://github.com/andycai/luaprimer/blob/master/02.md#4-加載模塊)(4) 加載模塊 Lua 提供一個名為 require 的函數來加載模塊,使用也很簡單,它只有一個參數,這個參數就是要指定加載的模塊名,例如: ~~~ require("<模塊名>") -- 或者是 -- require "<模塊名>" ~~~ 然后會返回一個由模塊常量或函數組成的 table,并且還會定義一個包含該 table 的全局變量。 或者給加載的模塊定義一個別名變量,方便調用: ~~~ local m = require("module") print(m.constant) m.func3() ~~~ require 的意義就是導入一堆可用的名稱,這些名稱(非local的)都包含在一個table中,這個table再被包含在當前的全局表(“通常的那個_G”)中,這樣訪問一個模塊中的變量就可以使用_G.table.**了,初學者可能會認為模塊里的名稱在導入后直接就是在 _G 中了。 ~~~ m=require module ~~~ 的 m 取決于這個導入的文件的返回值,沒有返回值時true,所以在標準的情況下模塊的結尾應該 return 這個模塊的名字,這樣 m 就是這個模塊的table了。 ### [](https://github.com/andycai/luaprimer/blob/master/02.md#5-加載機制)(5) 加載機制 對于自定義的模塊,模塊文件不是放在哪個文件目錄都行,函數 require 有它自己的文件路徑加載策略,它會嘗試從 Lua 文件或 C 程序庫中加載模塊。 require 用于搜索 Lua 文件的路徑是存放在全局變量 package.path 中,當 Lua 啟動后,會以環境變量 LUA_PATH 的值來初始這個環境變量。如果沒有找到該環境變量,則使用一個編譯時定義的默認路徑來初始化。 當然,如果沒有 LUA_PATH 這個環境變量,也可以自定義設置,在當前用戶根目錄下打開 .profile 文件(沒有則創建,打開 .bashrc 文件也可以),例如把 "~/lua/" 路徑加入 LUA_PATH 環境變量里: ~~~ #LUA_PATH export LUA_PATH="~/lua/?.lua;;" ~~~ 文件路徑以 ";" 號分隔,最后的 2 個 ";;" 表示新加的路徑后面加上原來的默認路徑。 接著,更新環境變量參數,使之立即生效: ~~~ source ~/.profile ~~~ 這時假設 package.path 的值是: ~~~ /Users/dengjoe/lua/?.lua;./?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;/usr/local/lib/lua/5.1/?.lua;/usr/local/lib/lua/5.1/?/init.lua ~~~ 那么調用 require("module") 時就會嘗試打開以下文件目錄去搜索目標 ~~~ /Users/dengjoe/lua/module.lua; ./module.lua /usr/local/share/lua/5.1/module.lua /usr/local/share/lua/5.1/module/init.lua /usr/local/lib/lua/5.1/module.lua /usr/local/lib/lua/5.1/module/init.lua ~~~ 如果找過目標文件,則會調用 package.loadfile 來加載模塊。否則,就會去找 C 程序庫。搜索的文件路徑是從全局變量 package.cpath 獲取,而這個變量則是通過環境變量 LUA_CPATH 來初始。搜索的策略跟上面的一樣,只不過現在換成搜索的是 so 或 dll 類型的文件。如果找得到,那么 require 就會通過 package.loadlib 來加載它。
                  <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>

                              哎呀哎呀视频在线观看