无法加载模块:public_Lua模块与包
生活随笔
收集整理的這篇文章主要介紹了
无法加载模块:public_Lua模块与包
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
--[[ 模塊是類似于一個封裝庫,Lua5.1開始,Lua加入了標準的模塊管理機制,可以把一些公用的代碼放在一個文件里,以API的接口形式在其他地方調用 Lua的模塊是由變量、函數等元素組成的table,所以要創建一個模塊很簡單,就是創建一個表,然后把需要導出的常量、函數放到創建的表中,最后使用return吧這個表返回去。 創建自定義模塊]]--[[-- 把下面的代碼存放到文件名為 my_module.lua 文件里-- 定義一個名為 module 的模塊my_module = {}-- 定義常量my_module.constant = "constant是個常量,而且能直接訪問"-- 定義一個函數function my_module.my_func1() io.write("這個函數是public,外部能直接訪問\n")endlocal function my_func2() io.write("這個函數是private,外部無法訪問\n")endfunction my_module.my_func3() func2()endreturn my_module]] --[[ 模塊的結構就是表結構,可以像操作表那樣來操作模塊里面的元素。 演示代碼中的函數my_func2()唄聲明為程序塊的局部變量,是一個私有函數,外部無法直接調用,只能通過模塊里面的工公共接口函數來調用。 ]]-- **************************************************************************-- require 函數-- Lua提供了一個名為require的函數用來加載模塊,要加載一個模塊,只要簡單地調用就可以了-- require("")-- require ""-- 執行require后會返回一個由模塊常量或函數組成的table,并且還會定義一個包含該table的全局變量require("my_module")print(my_module.constant)-- constant是個常量,而且能直接訪問my_module.my_func3()-- 這個函數是private,外部無法訪問-- 給加載的模塊定義一個別名變量local m = require "my_module"print(m.constant)-- 這是一個常量m.my_func1()-- 這個函數是public,外部能直接訪問print("\n")-- 加載機制--[[ 對于自定義的模塊,模塊文件不是放在哪個文件目錄都行,函數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的值是 /usr/local/share/lua/5.4/?.lua;/usr/local/share/lua/5.4/?/init.lua;/usr/local/lib/lua/5.4/?.lua;/usr/local/lib/lua/5.4/?/init.lua;./?.lua;./?/init.lua 那么,調用require("module")時就會嘗試打開以下文件目錄去搜索目標 /usr/local/share/lua/5.4/module.lua /usr/local/share/lua/5.4/module/init.lua /usr/local/lib/lua/5.4/module.lua /usr/local/lib/lua/5.4/module/init.lua ./module.lua; ./module/init.lua 如果找到目標文件,則會調用package.loadfile來加載模塊。否則,就回去找C程序庫 搜索的文件路徑是從全局變量package.cpath獲取,而這個變量是通過環境變量LUA_CPATH來初始 /usr/local/lib/lua/5.4/?.so;/usr/local/lib/lua/5.4/loadall.so;./?.so 搜索的策略跟上面的一樣,只不過現在換成搜索的是so或dll類型的文件,如果找得到,那么require就會通過package.loadlib來加載它]]print(package.path)-- /usr/local/share/lua/5.4/?.lua;/usr/local/share/lua/5.4/?/init.lua;/usr/local/lib/lua/5.4/?.lua;/usr/local/lib/lua/5.4/?/init.lua;./?.lua;./?/init.luaprint(package.cpath)-- /usr/local/lib/lua/5.4/?.so;/usr/local/lib/lua/5.4/loadall.so;./?.soprint("\n\n")-- C語言包--[[ 與Lua中寫包不同,C語言包在使用以前必須加載并連接,最簡單并且容易的實現方式是通過動態連接庫機制 Lua在一個叫loadlib的函數內提供了所有的動態連接的功能,這個函數有兩個參數:庫的絕對路徑和初始化函數。 來看看一個例子 local path = "/usr/local/lua/lib/libluasocket.so" local f = loadlib(path,"luaopen_socket") loadlib函數加載指定的庫并連接到Lua,但是它并不打開load入的庫(沒有調用初始化函數),而是返回初始化函數作為Lua中的一個函數,然后可以直接在lua代碼中調用這個返回的函數。 如果加載動態庫或者查找初始化函數時出錯,loadlib將返回nil和錯誤信息,我們可以修改前面一段代碼,使其檢測錯誤然后調用初始化函數 local path = "/usr/local/lua/lib/libluasocket.so" -- 或者 path = "C:\\windiws\luasocket.dll",這個是windows平臺下 local f = assert(loadlib(path, "luaopen_socket")) f() -- 這里才是真正打開庫 通常,我們希望二進制的發布庫包含一個與前面代碼段相似的stub文件,安裝的時候可以任意放在任何一個目錄中,只需要改一改stub文件對二進制庫的實際路徑 將stub文件所在的目錄路徑加入到LUA_PATH里面,然后就可以直接使用require函數導入C語言寫的庫]
掃碼關注一下唄~
總結
以上是生活随笔為你收集整理的无法加载模块:public_Lua模块与包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 购物商城Web开发第二十三天
- 下一篇: vscode里面如何配置库_VSCode