天天看點

編寫C函數的技術-《lua程式設計》 27章 學習

void lua_rawgeti(lua_State * L ,int index,int key)

void lua_rewseti(lua_State * L,int index,int key)

index表示table在棧的位置,key表示元素在table中的位置

test.lua内容

<a></a>

lua_pushlstring(L,s+I,j-i+1) 把一個字元串區間為[I,j]傳遞給lua

下面函數将一個字元串以分隔符生成一個表 例如調用 split(“he,3,66,22”) 會傳回table {“he”,”3”,”66”,”22”}

test.lua

還有一些相關的函數 lua_pushfstring,luaL_buffinit,luaL_addchar,luaL_add 等lua幫助檔案都有說明

對于一個lua函數 來說,有3種地方可以儲存非局部資料他們是,全局變量,函數環境和非局部的變量(closure中)

系統資料庫是位于一個”僞索引“上,這個索引值由LUA_REGISTRYINDEX定義。僞索引就像一個棧中的索引,但它所關聯的值不在棧中。為了擷取系統資料庫中的key為”Key”的值,可以這麼做

lua_getfield(L,LUA_REGISTRYINDEX,”KEY”)

在系統資料庫中為了避免沖突的key盡量不要用常用的名字,在系統資料庫中不應使用數字類型的key,因為這種key是被”引用系統“所保留的,這個系統由輔助庫中的一系列函數組成,它可以在向一個table存儲value時忽略如何建立一個唯一 的key

int r = luaL_ref(L,LUA_REGISTRYINDEX);  //彈出一個值,然後用新配置設定的整數key來将這個值儲存到系統資料庫中,最後傳回這個key,這個key被稱為”引用 “

lua_rewgeti(L,LUA_REGISTRYINDEX,r); //将與引用關聯的值壓入棧中

luaL_unref(L,LUA_REGISTRYINDEX,r); //釋放該值和引用

lua5.1開始每一個c函數都有自己的一個環境table一個函數可以像通路系統資料庫一樣通過一個僞索引來通路他的環境table環境table的僞索引是LUA_ENVIRONINDEX。在在C語言中設定環境的代碼如下:

3.3 upvalue

系統資料庫提供了全局變量的存儲,環境提供了子產品變量的存儲,而upvalue機制則實作了一種類似于c語言中靜态變量的機制。這種變量隻在一個特定函數中可見。每當lua中建立一個函數時,都可以瘵任務數量的upvalue與這個函數關聯

将這種c函數與upvalue關聯稱為closureg一個c closure類似于Lua closure。closure可以用同一個函數代碼來建立多個closure,每個closre可以擁有不同的upvalue