Latest web development tutorials

แพคเกจโมดูล 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 ต้นขั้วการตั้งค่านี้สามารถนำมาใช้หลังจากที่โหลดซีทำงานห้องสมุดจำเป็นต้องใช้