Что такое userdata и lightuserdata в Lua?

Оглядывание и использование некоторых функций C# 3.0 мы можем сделать это:

foreach (KeyValuePair<string,int> item in keywordCounts.OrderBy(key=> key.Value))
{ 
    // do something with item.Key and item.Value
}

Это - самый чистый способ, которым я видел, и подобно Ruby способ обработать хеши.

25
задан Lars 1 December 2010 в 22:06
поделиться

1 ответ

Во-первых, userdata означает полные userdata. Вот два решения для реализации CharArray. Пожалуйста, смотрите ниже:

//full userdata 
extern "C" int newarray(lua_State* L)
{
     int n = luaL_checkint(L, 1);
     size_t nbytes = sizeof(CharArray) + (n - 1)*sizeof(char);
     CharArray* a = (CharArray*)lua_newuserdata(L, nbytes);
     a->size = n;
     return 1;
}

//light userdata 
extern "C" int newlarray(lua_State* L)
{
    int n = luaL_checkint(L, 1);
    size_t nbytes = sizeof(CharArray) + (n - 1)*sizeof(char);
    CharArray* a = (CharArray*)(new char(nbytes));

    lua_pushlightuserdata(L,a);
    a->size = n;

    return 1;
}

Полные пользовательские данные - это необработанная область памяти без предопределенных операций , которые предлагает Lua . Таким образом, пользовательские данные должны управляться сборщиком мусора. С другой стороны, легкие userdata - это просто значение, представляющее указатель C (то есть значение void *). Легкие пользовательские данные не должны управляться сборщиком мусора (и не являются им).

2
ответ дан 28 November 2019 в 18:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: