這幾天開了個小差, 把lua的很多擴充庫都用了一下, luasocket, luasql, luacom, kepler... 最後終於理解了require的作用了. 其實也就是pil提及到的搜尋載入目錄那麼簡單,當然有一個經驗就是定義LUA_PATH與package.cpath的值,就像定義include和lib的路徑一樣, 可以方便地匯入到lua環境
本來打算用luasql的odbc庫來做資料庫訪問的開發, 執行sql語句, 遊標以及事務都成功了, 唯獨執行帶參數的預存程序不知道怎麼搞, 這可鬱悶了我很久. 由於對odbc不熟, 就查了下msdn文檔, 後面看看luasql的源碼發現於根本沒有支援預存程序的參數. 看來要麼就要自己在luasql的基礎上擴充下,要麼就要放棄它了. 手頭上的事很多, 先放放,搞清楚一下odbc再說.
現在又回到了pil專註lua的文法了. table真的很cool,可以輕鬆實現疏鬆陣列, 串, 隊列(單雙向), 棧,集合以及各種其它的資料結構, 而且非常好用. metatables和metamethods確實很酷, 利用這些東西可以實現運算子多載(看上去像), 繼承(單/多),封裝, getter/setter等等. 暫時還沒有看到類的那一章. 有了前面的內容,怎麼用__index定義原型鏈構造一個類的繼承體系, 加上package, 應該八九不離十了,先意淫一把.
忘了補充一下, 5.1 c api 中的 luaopen_*現在和lua調用其它普通c函數的過程一樣:
lua_pushcfunction(L, luaopen_*);
lua_call();
也可以用
lua_cpcall(L, luaopen_*, 0); 簡化上面兩步的操作, 實際了看lua_cpcall的源碼就知道,是一樣的
那麼現在5.1推薦的開始調用lua的寫法是這樣的:
lua_State *L = luaL_newstate();
lua_cpcall(L, luaopen_base, 0);
lua_cpcall(L, luaopen_io, 0);
lua_cpcall(L, luaopen_string, 0);
// ...
// ...