แพคเกจโมดูล Lua
โมดูลจะคล้ายกับแพคเกจห้องสมุดเริ่มต้นจาก Lua 5.1 Lua เพิ่มกลไกการจัดการโมดูลมาตรฐานคุณสามารถใส่รหัสบางอย่างร่วมกันในไฟล์เดียวในรูปแบบของการเรียก API ของอินเตอร์เฟซในสถานที่อื่น ๆ ในความโปรดปรานของรหัสนำมาใช้ใหม่และลด การมีเพศสัมพันธ์รหัส
โมดูล Lua เป็นตารางจากตัวแปรฟังก์ชั่นและองค์ประกอบอื่น ๆ ที่รู้จักจึงสร้างโมดูลที่ง่ายมากคือการสร้างตารางแล้วจำเป็นที่จะต้องส่งออกคงที่ฟังก์ชั่นเป็นที่ในที่สุดก็กลับไปที่โต๊ะในบรรทัด ต่อไปนี้คือการสร้าง module.lua โมดูลที่กำหนดเอง, รูปแบบรหัสไฟล์จะเป็นดังนี้:
-- 文件名为 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
จากที่กล่าวมาโครงสร้างของโมดูลเป็นโครงสร้างของตารางเพื่อให้คุณสามารถโทรหาตารางเป็นองค์ประกอบในการดำเนินงานในการดำเนินงานเป็นค่าคงที่ในโมดูลการโทรหรือฟังก์ชั่น
func2 เหนือประกาศเป็นตัวแปรท้องถิ่นป้องกันนั่นหมายความว่าฟังก์ชั่นส่วนตัวและดังนั้นจึงไม่สามารถเข้าถึงได้จากภายนอกโมดูลการทำงานของภาคเอกชนจะต้องเรียกว่าโดยโมดูลฟังก์ชั่นที่สาธารณะ
จำเป็นต้องมีฟังก์ชั่น
Lua ให้ฟังก์ชั่นที่เรียกว่าต้องถูกนำมาใช้ในการโหลดโมดูล ในการโหลดโมดูลเพียงแค่เรียกมันว่า ตัวอย่างเช่น:
require("<模块名>")
หรือ
require "<模块名>"
จะกลับมาหลังจากการดำเนินการต้องมีค่าคงที่หรือฟังก์ชั่นโดยโมดูลประกอบด้วยตารางและจะกำหนดตัวแปรทั่วโลกที่มีตาราง
-- test_module.lua 文件 -- module 模块为上文提到到 module.lua require("module") print(module.constant) module.func3()
รหัสข้างต้นจะถูกดำเนินการเป็นผลมาจาก:
这是一个常量 这是一个私有函数!
หรือจะโหลดโมดูลกำหนดตัวแปรนามแฝงโทรง่าย:
-- test_module2.lua 文件 -- module 模块为上文提到到 module.lua -- 别名变量 m local m = require("module") print(m.constant) m.func3()
รหัสข้างต้นจะถูกดำเนินการเป็นผลมาจาก:
这是一个常量 这是一个私有函数!
กลไกการโหลด
สำหรับโมดูลที่กำหนดเองไม่ได้อยู่ในไดเรกทอรีที่ไฟล์จะทำต้องมีฟังก์ชั่นยังมีกลยุทธ์ในการโหลดไฟล์เส้นทางของตัวเองก็พยายามที่จะโหลดไฟล์จากโมดูล Lua หรือ C โปรแกรมห้องสมุด
ต้องใช้เส้นทางการค้นหาไฟล์ Lua ถูกเก็บไว้ใน package.path ตัวแปรทั่วโลกหลังจากที่รองเท้าลัวะ LUA_PATH ค่าเริ่มต้นของตัวแปรสภาพแวดล้อมเพื่อตัวแปรสภาพแวดล้อม ถ้าคุณไม่พบตัวแปรสภาพแวดล้อมเส้นทางเริ่มต้นที่กำหนดโดยการเริ่มต้นเวลารวบรวม
แน่นอนถ้าไม่มี LUA_PATH ตัวแปรสภาพแวดล้อมนี้คุณยังสามารถปรับแต่งการตั้งค่าเปิดในแฟ้ม .profile ไดเรกทอรีบ้านของผู้ใช้ปัจจุบัน (มันไม่ได้สร้างคุณยังสามารถเปิดไฟล์ .bashrc), การยกตัวอย่างเช่น "~ / Lua /" เส้นทางที่จะเข้าร่วมกับสภาพแวดล้อม LUA_PATH ตัวแปร:
#LUA_PATH export LUA_PATH="~/lua/?.lua;;"
เส้นทางของแฟ้ม ";" แยกจากกันโดยสองคนสุดท้าย ";;" หมายถึงที่เพิ่มใหม่บวกเส้นทางเดิมของเส้นทางเริ่มต้น
ถัดไปปรับปรุงพารามิเตอร์ตัวแปรสภาพแวดล้อมของคุณที่จะมีผลในทันที
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
ดังนั้นเมื่อจำเป็นต้องเรียก ( "โมดูล") จะพยายามที่จะเปิดไดเรกทอรีไฟล์ต่อไปนี้เพื่อค้นหาเป้าหมาย
/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 ตัวแปรสภาพแวดล้อม
กลยุทธ์การค้นหาแบบเดียวกับที่ดังกล่าวข้างต้น แต่ตอนนี้การค้นหาเพื่อแทนที่หรือประเภทไฟล์ DLL หากคุณพบมันแล้วมันจะต้องโดย 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 ส่งกลับศูนย์และข้อความผิดพลาด เราสามารถปรับเปลี่ยนส่วนก่อนหน้านี้ของรหัสในการตรวจสอบข้อผิดพลาดแล้วโทรฟังก์ชั่นเริ่มต้น:
local path = "/usr/local/lua/lib/libluasocket.so" -- 或者 path = "C:\\windows\\luasocket.dll",这是 Window 平台下 local f = assert(loadlib(path, "luaopen_socket")) f() -- 真正打开库
ภายใต้สถานการณ์ปกติเราคาดว่าการเปิดตัวของห้องสมุดไบนารีมีรหัสก่อนหน้าตัวอย่างข้อมูลไฟล์ต้นขั้วที่คล้ายกันไบนารีการติดตั้งที่สามารถอยู่ได้อย่างง่ายดายในไดเรกทอรีคุณจะต้องปรับเปลี่ยนไฟล์ไลบรารีต้นขั้วไบนารีสอดคล้องกับเส้นทางจริง
ไดเรกทอรีที่ไฟล์นั้นถูกบันทึกอยู่ใน LUA_PATH ต้นขั้วการตั้งค่านี้สามารถนำมาใช้หลังจากที่โหลดซีทำงานห้องสมุดจำเป็นต้องใช้