标签: lua-table

如何在Lua中将文本文件加载到类似表的变量中?

我需要将文件加载到Lua的变量中.

比方说我得到了

name address email
Run Code Online (Sandbox Code Playgroud)

每个之间都有空间.我需要文本文件中包含许多这样的行来加载到某种对象中 - 或者至少将一行切割成由空格分隔的字符串数组.

在Lua这种工作是否可行,我应该怎么做?我对Lua很新,但我在互联网上找不到任何相关内容.

lua load file lua-table

6
推荐指数
2
解决办法
2万
查看次数

Lua Metatable不一致

我无法理解为什么__index这些示例之间的元方法行为存在差异:

A = { __index = A }   
function A:speak()
    print("I'm an A")
end
An_A = setmetatable({},A)
An_A:speak()
Run Code Online (Sandbox Code Playgroud)

会引发以下错误: lua: l.lua:8: attempt to call method 'speak' (a nil value)

同时

B = { __index = function(t,key)  return B[key] end }
function B:speak()
    print("I'm an B")
end
An_B = setmetatable({},B)
An_B:speak()
Run Code Online (Sandbox Code Playgroud)

将按预期执行,输出I'm an B.


在试图理解为什么会这样的情况下,我阅读了PiL的这一部分.它指出:

使用__index元方法进行继承是如此常见,以至于Lua提供了一种快捷方式.尽管有名称,但__index元方法不需要是一个函数:它可以是一个表,而不是.当它是一个函数时,Lua用表和缺席键作为参数来调用它.当它是一个表时,Lua重做该表中的访问权限.

我对此的理解是,在涉及"A"的代码段中,__index = A导致访问在表中完成A(根据上面引用的加速分段).如果是这种情况,我不明白为什么"speak"找不到与密钥相关的功能.为了尝试修复此问题,我决定在B代码段中实现函数方法,该方法返回与keyin 关联的值B,并且它有效.当然__index = …

lua metatable lua-table

6
推荐指数
1
解决办法
394
查看次数

Lua:表预计,没有

所以,我在尝试将字符串分成表格(玩家加入团队)时遇到了问题.当只有两个玩家时,它就像一个魅力,但当有3个以上的玩家时,会弹出:" Init Error:transformice.lua:7:bad argument:table expected,nil ".一切似乎都没问题,我真的不知道什么是错的.你能帮我吗?谢谢!这是我的代码:

ps = {"Player1","Player2","Player3","Player4"}
local teams={{},{},{}}

--[[for name,player in pairs(tfm.get.room.playerList) do
 table.insert(ps,name)
 end]]

table.sort(ps,function() return math.random()>0.5 end)
for i,player in ipairs(ps) do
  table.insert(teams[i%#teams],player)
  end
Run Code Online (Sandbox Code Playgroud)

lua lua-table

6
推荐指数
1
解决办法
5383
查看次数

为什么表格文字与Lua中的表格引用区别对待?

这是一个Lua 5.2.2脚本,显示了表的声明和索引:

> mylist = {'foo', 'bar'}
> print(mylist[1])
foo
Run Code Online (Sandbox Code Playgroud)

以下声明为何不合法?

> print({'foo', 'bar'}[1])
stdin:1: ')' expected near '['
Run Code Online (Sandbox Code Playgroud)

我想不出任何其他语言,其中文字不能替代参考(当然,除非需要左值).

FWIW,使表格文字具有括号,使声明合法:

> print(({'foo', 'bar'})[1])
foo
Run Code Online (Sandbox Code Playgroud)

lua lua-table

6
推荐指数
2
解决办法
364
查看次数

LuaPlus:如何使函数返回表?

我想知道如何从C++端创建和注册一个函数,该函数在从Lua端调用时返回一个表.
我尝试过很多东西,但没有什么能真正起作用.:/

(对不起长代码)这个例子不起作用,因为Register()需要一个"luaCFunction"样式函数:

LuaPlus::LuaObject Test( LuaPlus::LuaState* state ) {
    int top = state->GetTop();
    std::string var( state->ToString(1) );

    LuaPlus::LuaObject tableObj(state);
    tableObj.AssignNewTable(state);

    if (var == "aaa")
        tableObj.SetString("x", "ABC");
    else if (var == "bbb")
        tableObj.SetString("x", "DEF");
    tableObj.SetString("y", "XYZ");
    return tableObj;
}
int main()
{
    LuaPlus::LuaState* L = LuaPlus::LuaState::Create(true);
     //without true I can't access the standard libraries like "math.","string."...
     //with true, GetLastError returns 2 though (ERROR_FILE_NOT_FOUND)
     //no side effects noticed though

    LuaPlus::LuaObject globals = L->GetGlobals();

    globals.Register("Test",Test);

    char pPath[MAX_PATH];
    GetCurrentDirectory(MAX_PATH,pPath);
    strcat_s(pPath,MAX_PATH,"\\test.lua");
    if(L->DoFile(pPath)) {
        if( L->GetTop() …
Run Code Online (Sandbox Code Playgroud)

c++ lua function lua-table luaplus

6
推荐指数
1
解决办法
1203
查看次数

ServiceStack Redis,如何将Lua表作为List返回

我正在使用ServiceStack的Redis客户端.我有一个Lua脚本,用几个Redis调用的结果填充一个Lua表.我想以某种方式返回此表.我的想法是使用来自客户端lib的方法ExecLuaShaAsList,并在lua脚本中执行"return myTable".它不起作用,我总是得到一个空列表.

如何将lua表返回给redis客户端?

这是我与Redis客户端一起使用的C#脚本:

using (var redisClient = GetPooledRedisClient())
{
    var sha1 = redisClient.LoadLuaScript(luaBody);
    List<string> theList = redisClient.ExecLuaShaAsList(sha1);
    int listLength = theList.Count(); //listLength is always 0 for some reason
}
Run Code Online (Sandbox Code Playgroud)

从以下答案后提示更新

这就是LuaBody的创建方式:

    private string GetLuaScript(List<CatalogItem> categories, List<CatalogItem> products)
    {
        string categoriesToAggregate = string.Join("\",\"", categories.Select(c=>c.Name));
        categoriesToAggregate = "\"" + categoriesToAggregate + "\"";

        string csSearchResult = string.Join("\",\"", products.Select(c => c.Name));
        csSearchResult = "\"" + csSearchResult + "\"";


        StringBuilder sb = new StringBuilder();
        sb.AppendLine("local categoriesToAggregate = {").Append(categoriesToAggregate).Append("}                        ");
        sb.AppendLine("local csSearchResult = {").Append(csSearchResult).Append("}                                      "); …
Run Code Online (Sandbox Code Playgroud)

lua redis lua-table

6
推荐指数
1
解决办法
3832
查看次数

按键排序Lua表

我已经经历了很多问题和谷歌搜索结果,但找不到解决方案.

我正在尝试使用table.sortLua中的函数对表进行排序,但我无法弄清楚如何使用它.

我有一个表,其中键是随机数值.我想按升序排序.我也浏览过Lua wiki页面,但table.sort只能使用表值.

t = { [223]="asd", [23]="fgh", [543]="hjk", [7]="qwe" }
Run Code Online (Sandbox Code Playgroud)

我希望它像:

t = { [7]="qwe", [23]="fgh", [223]="asd", [543]="hjk" }
Run Code Online (Sandbox Code Playgroud)

sorting lua key lua-table

6
推荐指数
3
解决办法
8884
查看次数

从C读Lua表

我正在尝试将Lua表传递给我的C程序,但我不知道该怎么做.

我的Lua代码:

local stages = {}
stages[1] = stage1
stages[2] = stage2
stages[3] = stage3

lstage.buildpollingtable(stages)
Run Code Online (Sandbox Code Playgroud)

我的C代码:

static int lstage_build_polling_table (lua_State * L) {    
    luaL_checktype(L, 1, LUA_TTABLE);

    lua_getfield(L, 1, "stage1");
    lua_getfield(L, 1, "stage2");
    lua_getfield(L, 1, "stage3");

    stage_t s1 = lstage_tostage(L, -3);
    stage_t s2 = lstage_tostage(L, -2);
    stage_t s3 = lstage_tostage(L, -1);

    printf("%d\n",s1->priority);
    printf("%d\n",s2->priority);
    printf("%d\n",s3->priority);

    return 1;
}
Run Code Online (Sandbox Code Playgroud)

我需要做什么来运行所有元素?此代码生成如下错误:

错误的参数#-3到'buildpollingtable'(lstage-Stage*预期,得到表)

谁能解释我做错了什么?

c lua lua-api lua-table

6
推荐指数
1
解决办法
609
查看次数

如何在初始化期间自引用表

有没有更短的方法来做到这一点:

local thisismytable = {
    non = sequitur
}
thisismytable.whatismytable = thisismytable
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.我不想重新创建预先存在的功能.

lua lua-table

6
推荐指数
2
解决办法
245
查看次数

Lua表访问效率

我对访问Lua表中的数据有疑问。
说,有一个很大的Lua表,如下所示:

 tbl = {
         {
           blockIdx = 5,
           key1 = "val1",
           key2 = "val2",
           ...
         },
         {
           blockIdx = 30,
           key1 = "val11",
           key2 = "val12",
           ...
         },
         {
           blockIdx = 83,
           key1 = "val21",
           key2 = "val22",
           ...
         },
         ...
       }
Run Code Online (Sandbox Code Playgroud)

现在,我想找到一个块,blockIdx例如38
因此,通常情况下,我想使用for该块:

for k,v in pairs(tbl) do
     if v.blockIdx == 38 then
        blahFunction(v)
     end
end
Run Code Online (Sandbox Code Playgroud)

但是我认为这不是一个好主意,特别是对于大桌子。
所以我对表做了一些修改:

 tbl = {
         [5] = { 
           key1 = "val1",
           key2 = "val2",
           ...
         }, …
Run Code Online (Sandbox Code Playgroud)

performance lua lua-table

5
推荐指数
1
解决办法
1548
查看次数

标签 统计

lua ×10

lua-table ×10

c ×1

c++ ×1

file ×1

function ×1

key ×1

load ×1

lua-api ×1

luaplus ×1

metatable ×1

performance ×1

redis ×1

sorting ×1