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が正の値の場合、次のコードを使用できます.
注:テーブルを巡回するときは、キーが実際に文字列であることを知らない限り、キーにlua_を直接呼び出さないでください.tolstring.考えてみろluatolstringは、所与のインデックスの値を変更する可能性があります.次のペアluaを混同しますnextの呼び出し.
方法2、indexは任意の場合:
前の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を遍歴します