Luaスタック上のテーブルの値を書き換えたり参照したりすることもできます.
void lua_settable (lua_State *L, int index);
void lua_setfield (lua_State *L, int index, const char *k);
void lua_gettable (lua_State *L, int index);
void lua_getfield (lua_State *L, int index, const char *k);
スタック上に存在しているテーブルにキーと値を格納するには
lua_settable関数かlua_setfield関数を使用します.
lua_settable関数はスタックトップには格納する値を,
スタックトップの一つ下にはキーとなる値を入れておき,
これらのペアをindexで指定したテーブルに格納します(図\ref{Fig:chaptest_stack10}).
また,スタックに積まれていたキーと値はスタック上から削除されます.
lua_setfield関数はキーを関数側から指定できます.
スタックトップには格納したい値を積んでおきます.
この関数はlua_settable関数とは違い,
キーには文字列しか指定できません(図\ref{Fig:chaptest_stack11}).
lua_gettable関数は
indexで指定したテーブルからキーと対になっている値を取得しスタックに積みます.
キーはスタックトップに積んでおきます(図\ref{Fig:chaptest_stack12}).
lua_getfield関数は
キーを関数側から指定できます.
この関数もlua_gettable関数とは違い,
キーには文字列しか指定できません(図\ref{Fig:chaptest_stack13}).
テーブルはC言語側から作成することができます.
空のテーブルを作成したい場合はlua_newtable関数を呼び出します
(図\ref{Fig:chaptest_stack09}).
void lua_newtable (lua_State *L);
この関数は実はlua_createtable関数のマクロとなっています.
void lua_createtable (lua_State *L, int narr, int nrec);
引数narrには配列要素の個数を,nrecには非配列要素の個数を指定します.
この個数を指定するとあらかじめ割り当て済みの空間が与えられます.
要はテーブルがたくさん要素を持つことがあらかじめ分かっている場合に
役にたつ関数です.
lua_newtable(L)
は
lua_createtable(L, 0, 0)
とマクロで定義されています.
通常テーブルを作る際はlua_newtable関数で十分です.
以上の関数を使ったサンプルコードをお見せします.
#include <stdio.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
void dumpStack(lua_State* L)
{
(略)
}
int main (void)
{
int i=0;
lua_State* L = luaL_newstate();
lua_newtable(L); //新しいtableの作成
lua_pushnumber(L, 10); //key
lua_pushstring(L, "hello"); //value
dumpStack(L);
// table[10] = "hello" を実行
lua_settable(L, -3);
dumpStack(L);
//value
lua_pushstring(L, "world");
//table["key"] = "world" を実行
lua_setfield(L, -2, "key");
dumpStack(L);
lua_pushnumber(L, 10);
//table[10]の値を取り出しスタックに積む
lua_gettable(L, -2);
dumpStack(L);
//table["key"]の値を取り出しスタックに積む
lua_getfield(L, -2, "key");
dumpStack(L);
lua_close(L);
return 0;
}
実行結果
Stack[ 3- string] : hello
Stack[ 2- number] : 10.000000
Stack[ 1- table] : table
Stack[ 1- table] : table
Stack[ 1- table] : table
Stack[ 2- string] : hello
Stack[ 1- table] : table
Stack[ 3- string] : world
Stack[ 2- string] : hello
Stack[ 1- table] : table