Lua: เพิ่ม method จาก C API

ปกติแล้วเพิ่ม 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 ข้างบนไปทดสอบนะครับ ดังนั้นก็น่าจะมีอะไรผิดพลาดอยู่เยอะเหมือนกัน

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s