【问题标题】:Difference between variable.functionName and variable["functionName"]variable.functionName 和 variable["functionName"] 之间的区别
【发布时间】:2015-04-17 20:16:10
【问题描述】:

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

variable.functionName

或使用名称作为字符串

variable["functionName"] or variable[functionNameString]

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

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

【问题讨论】:

    标签: lua lua-table


    【解决方案1】:

    PUC-Rio Lua 5.1 字节码用于​​p>

    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 行对字符串键的格式没有限制。

    【讨论】:

    • 该列表由luac -l -p 输出。
    【解决方案2】:

    它们是一样的。来自the manual

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

    【讨论】:

      猜你喜欢
      • 2013-07-22
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 2012-10-27
      • 2013-03-28
      • 1970-01-01
      • 2019-11-16
      • 2012-12-30
      相关资源
      最近更新 更多