变量.函数名和变量["函数名"]之间的区别

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

variable.functionName

或者使用名称作为字符串

variable["functionName"]或 variable[functionNameString]

我的问题是: 这些不同的方式是否会产生不同的结果,还是它们完全可以相互替换?

我主要关心性能方面的问题,但欢迎任何启发。

点赞
用户3677376
用户3677376

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+ 参数,3 个插槽,0 个上值,0 个局部变量,4 个常量,0 个函数
    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标识符,而不是一个保留关键字。而第二行和第三行对于字符串键的格式没有限制。

2015-04-17 10:36:23
用户1009479
用户1009479

它们是相同的。摘自手册:

... 为了表示记录,Lua 使用字段名称作为索引。语言通过提供 a.name 作为 a["name"] 的语法糖来支持此表示。

2015-04-17 12:16:10