一般的Lua运行时是否优化了表查找?

时间:2017-05-10 15:25:00

标签: lua

使用像命名空间一样的表可以在运行之前扩展它们的字段,以避免索引表吗?我计划使用Lua的5.3.3编译器。例如:

local Types = {
    A = 1,
    B = 2,
    C = 3
};

print(Types.A);

这会变成:

print(1);

或类似的东西(但可能更好):

local A = 1;
print(A);

直接?

2 个答案:

答案 0 :(得分:3)

不,Lua将按原样运行代码。这是编译器简单性的代价。
请参阅luac的输出:

main <2.lua:0,0> (8 instructions at 0x235bb10)
0+ params, 3 slots, 1 upvalue, 1 local, 7 constants, 0 functions
    1   [1] NEWTABLE    0 0 3
    2   [2] SETTABLE    0 -1 -2 ; "A" 1
    3   [3] SETTABLE    0 -3 -4 ; "B" 2
    4   [4] SETTABLE    0 -5 -6 ; "C" 3
    5   [7] GETTABUP    1 0 -7  ; _ENV "print"
    6   [7] GETTABLE    2 0 -1  ; "A"
    7   [7] CALL        1 2 1
    8   [7] RETURN      0 1

答案 1 :(得分:1)

您可以将2设置为临时表以解析全局名称:

int dropshipItems = orderItems
    .Where(x => !string.IsNullOrEmpty(x.Dropship))
    .GroupBy(x => x.Sku)
    .Count();

但要思考为什么你想要这个。请注意,在设置Types之前需要保存local Types = { A = 1, B = 2, C = 3 } do local print = print local _ENV = Types print(A) end