Re: [心得] Lua學習筆記
圖文: http://effective.pixnet.net/blog/post/26970839
Lua和C++(或其他語言)之間的資料交換,倚賴Stack機制。
這個Stack的索引是1-Base的,從Top往下算的話,可以使用負數索引-1, -2,...,如下面
的示意圖:
打開lua.h,我們可以看到許多堆疊處理的API。
首先,維護類的API完成例行的維護工作:
int (lua_gettop) (lua_State *L);
/// 取得元素總數
void (lua_settop) (lua_State *L, int idx);
/// 改變Top,因此捨棄了頂端的元素
void (lua_pushvalue) (lua_State *L, int idx); /// 將
idx位置的元素置頂,因此原先上方的元素往下移
void (lua_remove) (lua_State *L, int idx); ///
將idx位置的元素移除,因此原先上方的元素往下移
void (lua_insert) (lua_State *L, int idx);
/// 將top元素移至idx位置,原先idx以上(含)的元素往上移
void (lua_replace) (lua_State *L, int idx);
/// 將top元素取出,並設定到idx位置
int (lua_checkstack) (lua_State *L, int sz); ///
檢查Stack空間大小
void (lua_xmove) (lua_State *from, lua_State *to, int n); /// 搬移一些元素
詢問類的API幫助查詢stack的元素特性:
int (lua_isnumber) (lua_State *L, int idx); ///
是否能轉成數字
int (lua_isstring) (lua_State *L, int idx);
/// 是否能轉成字串
int (lua_iscfunction) (lua_State *L, int idx); ///
是否為函式
int (lua_isuserdata) (lua_State *L, int idx); ///
是否為自訂類
int (lua_type) (lua_State *L, int idx);
/// 傳回類型
const char *(lua_typename) (lua_State *L, int tp); /// 傳回類型
名稱
int (lua_equal) (lua_State *L, int idx1, int idx2); /// 比
較內容(使用lua的==運算)
int (lua_rawequal) (lua_State *L, int idx1, int idx2); /// 比對原
始內容
int (lua_lessthan) (lua_State *L, int idx1, int idx2); /// 比較大
小(使用lua的<運算)
轉換類的API(Stack -> C)幫助我們取得stack的元素:
lua_Number (lua_tonumber) (lua_State *L, int idx); /// 轉
為數字(浮點數double)
lua_Integer (lua_tointeger) (lua_State *L, int idx);
/// 轉為整數
int (lua_toboolean) (lua_State *L, int idx);
/// 轉為布林
const char *(lua_tolstring) (lua_State *L, int idx, size_t *len); /// 轉
為字串
size_t (lua_objlen) (lua_State *L, int idx);
/// 轉為物件長度(字串長度或userdata大小,其他類型傳回0)
lua_CFunction (lua_tocfunction) (lua_State *L, int idx); /// 轉
為C函式指標
void *(lua_touserdata) (lua_State *L, int idx);
/// 傳回userdata的指標(如果合法)
lua_State *(lua_tothread) (lua_State *L, int idx);
/// 傳回lua thread指標
const void *(lua_topointer) (lua_State *L, int idx);
/// 傳回指標(可以是userdata, thread, talbe, 或fucntion)
此外還有一大堆用來處理Push(C->Stack)、Get(Lua->Stack)、Set(Stack->Lua)、Call、
Coroutine、垃圾回收等,可自行參考lua.h,配合Lua Manual當可了解它們的用途。
--
http://effective.pixnet.net/blog
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 210.208.83.253
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):
心得
1
1