了解 Lua 中 object.function(argument) 和 object:function(argument) 之间的区别

Understanding the difference between object.function(argument) and object:function(argument) in Lua

obj ={x=30}

function obj:printpos()
  print(self.x)
end

other = {x=15}

obj.printpos(other)

obj.printpos(other) 给出了预期的输出即。 15。然而调用 obj:printpos(other) 并没有给出预期的 output.It 仍然打印 30。为什么调用 obj:printpos(other) 没有将 other 作为参数?基本上 object.function(argument)object:function(argument) 有什么区别? object:function(argument) 是否与 object:function() 相同,即参数是否被忽略?

obj:printpos(other) 等价于 obj.printpos(obj, other).

function obj:printpos() end 等同于 function obj.printpos(self) end.

来自Lua 5.4 Reference Manual - §3.4.11 – Function Definitions格式化我的):

The colon syntax is used to emulate methods, adding an implicit extra parameter self to the function. Thus, the statement

function t.a.b.c:f (params) body end

is syntactic sugar for

t.a.b.c.f = function (self, params) body end

从这里,我们可以看出冒号语法隐式地将 self 参数添加到函数范围。

相反,使用点语法调用冒号语法定义的函数将导致传递给它的第一个参数被分配给self参数。

因此,

local thing = {}

function thing:func()
    print(self)
end

来电

thing:func()
-- and
thing.func(thing)

thing分配给self

的结果相同
thing.func(other_thing)

会将 other_thing 分配给 self

的问题
thing:func(other_thing)

就是前面看到的,thing赋值给了selfother_thing 没有分配给任何参数,因为没有定义其他参数。