ปกติแล้วเพิ่ม function เข้าไปใน library ก็ใช้คำสั่ง luaL_register ประมาณข้างล่าง
#include "lua.h"
#include "lauxlib.h"
static int
luamylib_func1(lua_State *L)
{
...
...
...
}
static const
struct luaL_reg
mylib_functions[] = {
{"func1", "luamylib_func1"},
{NULL, NULL}
};
int
luaopen_mylib(lua_State *L)
{
luaL_register(L, "mylib", mylib_functions);
return 1;
}
ทำแบบข้างบนเราก็จะไปใช้ func1 ใน Lua ประมาณนี้
require "mylib"
mylib.func1()
อีกอย่างคือ table (น่าจะใกล้เดียงกับ object ใน javascript) ตามที่ไปดู code ของชาวบ้าน (lua-gd กับ lua-curl) มาก็ใช้ luaL_newmetatable สร้าง table กัน ก็จะได้ code ประมาณด้านล่าง
#include "lua.h"
#include "lauxlib.h"
int
luaopen_mylib(lua_State *L)
{
luaL_newmetatable(L, "mytab");
return 1;
}
แต่ปัญหาของผมมีอยู่ว่าปกติใช้ luaL_register นี้ function มันก็แยกไปต่างหาก ไม่ได้มาเชื่อมกับ object หรือ table ถ้าอยากทำอะไรกับ object หรือ table ก็ต้องมาสั่งประมาณ
require "mylib"
local myobj = ....
mylib.func1(myobj)
แต่ผมอยากได้ประมาณ
require "mylib"
local myobj = ....
myobj:my_mythod()
จะทำอย่างไร
คำตอบที่ดูจากคนอื่นมา แต่พึ่งอ่าน code เข้าใจคือ ใส่ NULL ไปแทน libname ของ luaL_register แล้ว function จะกลายเป็น method ของ table/object ที่อยู่บนสุดของ stack เอง
...
...
...
luaopen_mylib(lua_State *L)
{
luaL_newmetatable(L, "mytab");
luaL_register(L, NULL, mylib_functions); /* ใส่ NULL แทน */
return 1;
}
แต่เราก็ต้องดูด้วยว่า บนสุดของ stack เป็น table และใช่ table ที่เราอยากจะเพิ่ม method เข้าไปหรือเปล่า
อ่านส่วนหนึ่งมาจาก
http://docs.taoframework.com/Tao.Lua/Tao.Lua.Lua.luaL_register.html
ป.ล. ผมเขียนไปเรื่อยไม่ได้ลองเอา code ข้างบนไปทดสอบนะครับ ดังนั้นก็น่าจะมีอะไรผิดพลาดอยู่เยอะเหมือนกัน