1

lua にカスタム ユーザーデータがあります。tostringユーザーデータのインスタンス (Lua 内) で実行すると、常に のような文字列が返されます"userdata: 0xaddress"。ユーザーデータの名前 ( "Point: 0xaddress") を返すようにしたいのですが、ユーザーデータの大文字と小文字を区別するために をオーバーライドしたいということですtostring。これができるかどうか誰にもわかりますか?

#define check_point(L) \
    (Point**)luaL_checkudata(L,1,"Point")

static int 
luaw_point_getx(lua_State* L)
{
    Point** point_ud = check_point(L);
    lua_pushinteger(L, (*point_ud)->x);
    return 1;
}

static int 
luaw_point_gety(lua_State* L)
{
    Point** point_ud = check_point(L);
    lua_pushinteger(L, (*point_ud)->y);
    return 1;
}

void 
luaw_point_push(lua_State* L, Point* point)
{
    Point** point_ud = (Point**)lua_newuserdata(L, sizeof(Point*));
    *point_ud = point;
    luaL_getmetatable(L, "Point");
    lua_setmetatable(L, -2);
}

static const struct luaL_Reg luaw_point_m [] = {
    {"x", luaw_point_getx},
    {"y", luaw_point_gety},
    {NULL, NULL}
};

int 
luaopen_wpoint(lua_State* L)
{
    luaL_newmetatable(L, "WEAVE.Point");
    lua_pushvalue(L, -1);
    lua_setfield(L, -2, "__index");
    luaL_register(L, NULL, luaw_point_m);
    return 1;
}
4

2 に答える 2

4

__tostringを書いたのと同様の方法で、メタメソッドを提供する必要があり__indexます。

// [...]
int luaw_point_index(lua_State* L)
{
    lua_pushfstring(L, "Point: %p", lua_topointer(L, 1));
    return 1;
}

int luaopen_wpoint(lua_State* L)
{
    luaL_newmetatable(L, "WEAVE.Point");
    lua_pushvalue(L, -1);
    lua_setfield(L, -2, "__index");
    lua_pushcfunction(L, luaw_point_index);
    lua_setfield(L, -2, "__tostring");
    luaL_register(L, NULL, luaw_point_m);
    return 1;
}
于 2012-10-08T15:45:03.947 に答える
0

tostring値がカスタム タイプの 1 つであるかどうかを確認するようにオーバーライドする必要があります。そうである場合は、独自の関数を使用して名前を取得します。そうでない場合は、オーバーライドされた に渡しtostringます。これは通常、元の値を上位値に入れてからtostring、グローバルtostringをそれで置き換えることによって行われます。

于 2012-10-08T15:38:28.180 に答える