2

引数がテーブルであるかどうかを確認できる潜在的なパターンを次に示します。

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ルックアップをサポートする単なるユーザーデータなのかは気にしません。どちらかを受け入れたい。

4

2 に答える 2

0

一般に、このプロパティを定義する唯一のタイプであるため、ルックアップを持つのはテーブルだけです。ユーザーデータは不透明です。ホストだけがそれをどうするかを知っているか、特定の動作のためにメタテーブル (分析可能) を追加します。CData は LuaJIT でコンパイルする Lua の一部です。この型を C API で使用したことはありません (サポートされていますか?)。最後に、可能性のあるルックアップについてタイプ/メタテーブルを確認し、設定を確認するフィールドを要求する必要があります。回避方法はありませんlua_getfield(ただし、生のアクセスの方が高速である必要があります。 を参照してくださいlua_rawget)。例外は、 によるテーブル配列の長さのチェックですlua_objlen

さらに、型チェックの安価なソリューションはlua_is***関数です。

于 2015-09-26T01:14:54.067 に答える