C使用lua_nextネストtable(上)を巡る


概要
前のLuaノート-lua tableに関するC APIの文章では、setfield、settableなどのLua tableに関するいくつかの関数について述べた.
今日はluaを通過する方法についてお話しします.next関数はtableを遍歴しますが、もちろん内容を取るときは先に紹介したAPIを使います.この文章は主にlua_を説明します.next関数の原理.
lua_next関数
前述のtableを操作するapiではkeyを知る必要があることが多く,これは固定フォーマットのk−vペアを解析できるが,ネストされたテーブルを再帰的に遍歴するには,具体的なkey値を知らずに反復する必要がある.この場合lua_が必要ですnextインタフェース
lua_next関数の図解
上図はlua_を示していますnextの変調過程におけるスタックの変化状況(ここではスタックの底要素tableを省略)は、郭晨全体で以下のステップに分けられる.
1スタックトップ要素がnilの場合、nilをポップアップし、tableの最初のk-vペアのkeyとvalueをスタックに前後して入力し、trueを返します.
注意:このスタックのすべてがvalue(-1)、key(-2)です.
2スタックトップがkeyの場合、現在のkeyをポップアップし、keyをベースにtableの次のkey-valueをスタックに前後して入力し、trueを返します.
3スタックトップ要素が最後のkeyの場合、keyがポップアップされ、trueが返されます.
遍歴方法
tableのstack内のすべての位置がindexであると仮定し、Cコードからこのtableを遍歴するには2つの方法がある.
メソッド1 indexが正の値の場合、次のコードを使用できます.
/*      'index'    */
lua_pushnil(L);  ///<       
while (lua_next(L, index) != 0) {
	//   'key'(  -2) 'value'(  -1)
	printf("%s - %s
", lua_typename(L, lua_type(L, -2)), lua_typename(L, lua_type(L, -1))); lua_pop(L, 1); }

注:テーブルを巡回するときは、キーが実際に文字列であることを知らない限り、キーにlua_を直接呼び出さないでください.tolstring.考えてみろluatolstringは、所与のインデックスの値を変更する可能性があります.次のペアluaを混同しますnextの呼び出し.
方法2、indexは任意の場合:
//               
lua_pushvalue(L, index);  
// /      :-1 =>table: 
lua_pushnil(L);  
//       -1 => nil; -2 => table  
while (lua_next(L, -2))  
{  
	//    : -1 => value; -2 => key; -3 => table  
	// copy the key so that lua_tostring does not modify the original  
	lua_pushvalue(L, -2);  
	//    : -1 => key; -2 => value; -3 => key; -4 => table  
	printf("%s => %s
", lua_tostring(L, -1), lua_tostring(L, -2)); // pop value + copy of key, leaving original key lua_pop(L, 2); // stack now contains: -1 => key; -2 => table } lua_pop(L, 1);
の大まかな原理はこのようにして、次の編ではこの2つの方法でネストされたtableを遍歴します