1

良い一日

c++ std::map から lua スクリプトへのアクセスを許可する特定のタスクがあります。望ましいスクリプト構文は glob["tag"] = "value" または glob("tag") = "value" です

研究では、ルバインドバインディングを試しました

std::string & glob(const std::string &tag)
{
    static std::string value;
    return value;
}

...

luabind::module(&state)
[
    def("glob", &glob, luabind::return_reference_to(result))
]

ただし、以下にリストされているスクリプトの実行後

glob("tag") = "asdasd"
print(glob("tag"))

エラーが発生しました [string "glob("tag") = "asdasd"..."]:1: '=' の近くに予期しない記号があります

それでは、ご意見ご感想お待ちしております。

ありがとう

更新 2lhf: グローバル変数データは c++ 部分を介して保存およびシリアル化され、lua からアクセスする必要があります。luaState はスクリプトの実行ごとに作成され、実行間では存在しません。解決策の 1 つは、スクリプトの実行前にグローバル変数テーブルを作成して入力し、実行後にマップと同期することですが、十分に遅いと思います。そのため、前述の構文を使用した c 関数を介したアクセスを歓迎します。

4

2 に答える 2

3

glob("tag") = "asdasd"有効な Lua 構文ではないため、機能しません。 glob["tag"] = "value"働ける。indexおよびnewindex メタメソッドglobを使用してユーザーデータとして設定する必要があります。luabind については何も知らないので、その点についてはお答えできません。しかし、標準の Lua API を使用してそれを行うのは難しくありません。Lua には既に優れた連想配列があるのに、なぜC++マップを Luaにエクスポートする必要があるのだろうか。

于 2011-05-10T15:31:28.530 に答える
0

ええ、メタタブル ルールです。

サンプルから取得したいくつかの C コードを挿入する必要がありました

lua_createtable(&state, 0, 0);
lua_pushcfunction(&state, &getValue);
lua_setfield(&state, -2, "__index");
lua_pushcfunction(&state, &setValue);
lua_setfield(&state, -2, "__newindex");
lua_setmetatable(&state, -2);
lua_setglobal(&state, "global");

そして、すべてがうまくいきます、ありがとう

しかし、ここで別の質問があります: lua_setfield と lua_setmetatable に index == -2 を使用する必要があるのはなぜですか?

于 2011-05-11T08:58:50.503 に答える