variable.functionName 和变量 ["functionName"] 的区别

Difference between variable.functionName and variable["functionName"]

我知道你可以直接使用名称获取变量和调用函数

variable.functionName

或将名称用作字符串

variable["functionName"] or variable[functionNameString]

现在我的问题是: 这些不同的方式是否会产生任何差异,或者它们是否完全可以互换?

我对这里的性能最感兴趣,但欢迎任何启发。

PUC-Rio Lua 5.1 字节码为

print(variable.functionName)
print(variable["functionName"])
print(variable[functionNameString])

main <var.lua:0,0> (14 instructions, 56 bytes at 0xafe530)
0+ params, 3 slots, 0 upvalues, 0 locals, 4 constants, 0 functions
    1   [1] GETGLOBAL   0 -1    ; print
    2   [1] GETGLOBAL   1 -2    ; variable
    3   [1] GETTABLE    1 1 -3  ; "functionName"
    4   [1] CALL        0 2 1
    5   [2] GETGLOBAL   0 -1    ; print
    6   [2] GETGLOBAL   1 -2    ; variable
    7   [2] GETTABLE    1 1 -3  ; "functionName"
    8   [2] CALL        0 2 1
    9   [3] GETGLOBAL   0 -1    ; print
    10  [3] GETGLOBAL   1 -2    ; variable
    11  [3] GETGLOBAL   2 -4    ; functionNameString
    12  [3] GETTABLE    1 1 2
    13  [3] CALL        0 2 1
    14  [3] RETURN      0 1

如您所见,前两行生成完全相同的字节码(因此花费相同的时间),而第三行有一个额外的(全局)变量访问。

第一行仅有效,因为 "functionName" 是有效的 Lua 标识符而不是保留字。第2行和第3行对字符串键的格式没有限制。

他们是一样的。来自 the manual:

... To represent records, Lua uses the field name as an index. The language supports this representation by providing a.name as syntactic sugar for a["name"].