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

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 定義模塊:文件名為 module.lua ``` -- 定義一個名為 module 的模塊 module = {} -- 定義一個常量 module.constant = "這是一個常量" -- 定義一個函數 function module.func1() io.write("這是一個公有函數!\n") end local function func2() print("這是一個私有函數!") end function module.func3() func2() end return module ``` >模塊的結構就是一個 table 的結構,因此可以像操作調用 table 里的元素那樣來操作調用模塊里的常量或函數。 func2 聲明為程序塊的局部變量,即表示一個私有函數,因此是不能從外部訪問模塊里的這個私有函數,必須通過模塊里的公有函數來調用. ## 加載模塊 >require("<模塊名>") 或者 require "<模塊名>" 新建文件并使用: ``` require("module") print(module.constant) module.func3() //可以給加載的模塊定義別名 local m=require("module") print(m.constant) m.func3() ``` 對于自定義的模塊,模塊文件不是放在哪個文件目錄都行,函數 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 來加載它。 * * * ## C 包 Lua和C是很容易結合的,使用 C 為 Lua 寫包。 與Lua中寫包不同,C包在使用以前必須首先加載并連接,在大多數系統中最容易的實現方式是通過動態連接庫機制。 Lua在一個叫loadlib的函數內提供了所有的動態連接的功能。這個函數有兩個參數:庫的絕對路徑和初始化函數。所以典型的調用的例子如下: ``` local path="/usr/local/lua/lib/libluasocket.so" local f=loadlib(path,"luaopen_socket") ``` loadlib 函數加載指定的庫并且連接到 Lua,然而它并不打開庫(也就是說沒有調用初始化函數),反之他返回初始化函數作為 Lua 的一個函數,這樣我們就可以直接在Lua中調用他。 如果加載動態庫或者查找初始化函數時出錯,loadlib 將返回 nil 和錯誤信息。我們可以修改前面一段代碼,使其檢測錯誤然后調用初始化函數: ``` local path ="/usr/local/lua/lib/libluasocket.so" -- 或者 path = "C:\\windows\\luasocket.dll",這是 Window 平臺下 local f=assert(loadlib(path,"luaopen_socket")) f()?-- 真正打開庫 ``` 一般情況下我們期望二進制的發布庫包含一個與前面代碼段相似的 stub 文件,安裝二進制庫的時候可以隨便放在某個目錄,只需要修改 stub 文件對應二進制庫的實際路徑即可。 將 stub 文件所在的目錄加入到 LUA_PATH,這樣設定后就可以使用 require 函數加載 C 庫了。
                  <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>

                              哎呀哎呀视频在线观看