前言#
看了前幾篇自己總結(jié)的文章虑瀑,我發(fā)現(xiàn)了一個問題逛拱,那就是從標(biāo)題上不能直接的看出文章所講的內(nèi)容敌厘,所以從這一章開始我要改變標(biāo)題的風(fēng)格,直接把要總結(jié)的api列在標(biāo)題上朽合,這樣看起來更醒目俱两,也更容易查找饱狂。
言歸正傳,前兩章我們講了對通用table的操作锋华,然而我們知道在table中有個特例是我們使用頻率相當(dāng)高的嗡官,那就是數(shù)組箭窜,數(shù)組本來就是“一串”的毯焕,有沒有更簡便的存取方法呢,答案當(dāng)然是肯定的磺樱,lua為我們提供了以下兩個api可以直接對數(shù)組進行操作纳猫。
內(nèi)容#
lua_rawgeti##
- 原型:void lua_rawgeti (lua_State *L, int index, int n);
- 解釋:把 t[n] 的值壓棧, 這里的 t 是指給定索引 index 處的一個值竹捉。 這是一個直接訪問芜辕,它不會觸發(fā)元方法。
lua_rawseti##
- 原型:void lua_rawseti (lua_State *L, int index, int n);
- 解釋: 等價于 t[n] = v块差, 這里的 t 是指給定索引 index 處的一個值侵续, 而 v 是棧頂?shù)闹怠:瘮?shù)將把這個值彈出棧憨闰。 賦值操作是直接的状蜗,不會觸發(fā)元方法。
Usage##
- 首先我們來新建一個文件鹉动,文件命名為rawgetitest.lua編寫如下代碼:
-- 定義一個全局table
LanguagesTable =
{
"lua",
"c",
"c++",
"java",
"python",
}
-- 定義一個打印函數(shù)
function func_printarray()
print("\n");
for index,value in pairs(LanguagesTable) do
print("["..index.."] = ".. value);
end
end
- 然后我們編寫c++代碼如下:
lua_State *L = lua_open();
luaL_openlibs(L);
luaL_dofile(L,"rawgetitest.lua"); // 加載執(zhí)行l(wèi)ua文件
lua_getglobal(L,"LanguagesTable"); // 將全局表壓入棧
lua_rawgeti(L, -1, 2); // 取LanguagesTable[2]的值-->lua_rawgeti用法
if(lua_isnil(L, -1))
{
printf("c++ --> [2] = nil\n");
}
else
{
printf("c++ --> [2] = %s\n", lua_tostring(L, -1));
}
lua_pop(L,1); // 彈出棧頂變量
lua_getglobal(L, "func_printarray");// 改變之前先調(diào)用打印函數(shù)轧坎,查看原數(shù)組
lua_pcall(L, 0, 0, 0);
lua_pushstring(L, "php"); // 將要賦值的結(jié)果壓入棧
lua_rawseti(L, -2, 4); // 賦值操作 -->lua_rawseti用法
lua_pushstring(L, "swift"); // 將要賦值的結(jié)果壓入棧
lua_rawseti(L, -2, 8); // 賦值操作 -->lua_rawseti用法
lua_getglobal(L, "func_printarray");// 改變之后再調(diào)用打印函數(shù),查看改變后的結(jié)果
lua_pcall(L, 0, 0, 0);
lua_close(L); //關(guān)閉lua環(huán)境
- 結(jié)果
rawgeti.png
總結(jié)#
- 從api的名字我們可以看到這兩個方法是帶有“raw”前綴的泽示,可以推斷出這兩個方法不會調(diào)用table的元方法缸血。
- 既然是對數(shù)組進行操作,那么肯定少不了對下標(biāo)的使用械筛,兩個api函數(shù)的第3個參數(shù)都表示下標(biāo)捎泻,注意table數(shù)組的下標(biāo)是從1開始的。
- 從結(jié)果可以看到我們可以直接按下標(biāo)進行修改埋哟,并且下標(biāo)可以是不連續(xù)的族扰。
- 注意數(shù)組不連續(xù)時遍歷table的方法。