【问题标题】:Difference between . and : in Lua之间的区别。和:在 Lua
【发布时间】:2011-06-22 02:57:36
【问题描述】:

我对通过. 和通过: 的函数调用之间的区别感到困惑

> x = {foo = function(a,b) return a end, bar = function(a,b) return b end, }
> return x.foo(3,4)
3
> return x.bar(3,4)
4
> return x:foo(3,4)
table: 0x10a120
> return x:bar(3,4)
3

: 在做什么?

【问题讨论】:

标签: function lua


【解决方案1】:

冒号用于实现将self 作为第一个参数传递的方法。所以x:bar(3,4)应该和x.bar(x,3,4)一样。

【讨论】:

  • 啊...所以它是面向对象的语法糖。
  • 没错。在整个参考手册中,他们对此给出的唯一说明是“冒号语法用于定义方法,即具有隐式额外参数 self 的函数。” (5.0手册,pdf第19页底部)
  • ooh ahh... 我正要问官方文档在哪里,但你打败了我。做得很好。 :-)
  • @keyle 这取决于self 对象将作为第一个参数及其属性值。
  • @keyle 如果您调用的对象不是本地对象,冒号语法会快一点,因为虚拟机只检索一次。基本上像object.method(object,args) 这样的点语法会检索两次object,而object:method(arg) 只会检索一次object。如果object 是全局、上值或表字段,则:. 快。 . 永远不会比 : 快。
【解决方案2】:

对于定义,它完全与手动指定 self 相同 - 它甚至会在编译时产生相同的字节码。 IE。 function object:method(arg1, arg2)function object.method(self, arg1, arg2) 相同。

使用时:几乎. 相同 - 内部将使用一种特殊的调用来确保 object 和任何可能的计算/访问副作用只计算一次。调用object:method(arg1, arg2)object.method(object, arg1, arg2) 相同。

【讨论】:

    【解决方案3】:

    确切地说,obj:method(1, 2, 3)

    do
      local _obj = obj
      _obj.method(_obj, 1, 2, 3)
    end
    

    为什么是局部变量?因为,正如许多人指出的那样,obj:method() 只索引_ENV 一次以获取obj。这在考虑速度时通常很重要,但请考虑这种情况:

    local tab do
      local obj_local = { method = function(self, n) print n end }
      tab = setmetatable({}, {__index = function(idx)
        print "Accessing "..idx
        if idx=="obj" then return obj_local end
      end})
    end
    tab.obj.method(tab.obj, 20)
    --> Accessing obj
    --> Accessing obj
    --> 20
    tab.obj:method(10)
    --> Accessing obj
    --> 10
    

    现在想象一下 __index 元方法所做的不仅仅是打印一些东西。想象一下,它增加了一个计数器,将某些内容记录到一个文件中,或者从您的数据库中删除了一个随机用户。这样做两次或只做一次之间有很大的不同。在这种情况下,obj.method(obj, etc)obj:method(etc) 之间有明显的区别。

    【讨论】:

    • 你真的不应该担心这些东西。如果必须这样做,您的架构可能非常出了问题。
    • 我会说是相反的;好的代码不应该对无关代码的实现细节做任何假设。函数调用可能会或可能不会被记忆,这并不意味着比需要更频繁地调用它们是一种好习惯。
    猜你喜欢
    • 2014-04-29
    • 2021-04-16
    • 2013-03-29
    • 1970-01-01
    • 2021-12-25
    • 2020-05-10
    • 2014-09-20
    • 2010-10-28
    相关资源
    最近更新 更多