引数がテーブルであるかどうかを確認できる潜在的なパターンを次に示します。
int my_fn(lua_State *L) {
luaL_checktype(L, 1, LUA_TTABLE);
// .. do stuff with the table ..
}
これは、最初の引数がテーブルの場合はいつでも機能します。ただし、他の Lua タイプは、userdata などのテーブル ルックアップをサポートし、luajit では cdata をサポートします。
lua_getfield
呼び出す前に、via などのテーブル ルックアップが成功するかどうかを確認する良い方法はありますか? タイプをテーブルに制限しないということです。関連して、インデックス付きルックアップをサポートする luajit のタイプは、テーブル、ユーザーデータ、および cdata だけですか?
現在このバージョンで動作するLuaJITを使用しているため、Lua 5.1 C APIに限定された回答に最も興味があります。
明確化
luaL_checkXXX
関数の利点は、 1 行で次のことを行うことです。
- 型が間違っている場合は、有益でわかりやすいエラー メッセージをスローします。
- すぐに使用できる C フレンドリーな戻り値を提供します。
テーブルに似たものを探しています。C に適したハッシュ テーブルの戻り値は期待していませんが、問題の引数がインデックス可能でない場合は、同じ品質のエラー メッセージをユーザーに表示したいと考えています。
私はダックタイピングの哲学を受け入れています。引数からいくつかのキーにインデックスを付けたいだけの関数を書く場合、その引数が本当にテーブルなのか、__index
ルックアップをサポートする単なるユーザーデータなのかは気にしません。どちらかを受け入れたい。