我知道您可以直接使用名称来获取变量和调用函数
variable.functionName
或将名称用作字符串
variable["functionName"] or variable[functionNameString]
现在我的问题是: 这些不同方式是否存在任何差异,或者它们是否完全可以互换?
我最感兴趣的是这里的表现,但任何启蒙都是受欢迎的。
答案 0 :(得分:4)
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行对字符串键的格式没有限制。
答案 1 :(得分:1)
他们是一样的。来自the manual:
...为了表示记录,Lua使用字段名称作为索引。该语言通过提供
a.name
作为a["name"]
的语法糖来支持此表示。