了解 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
赋值给了self
。 other_thing
没有分配给任何参数,因为没有定义其他参数。
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 statementfunction 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
赋值给了self
。 other_thing
没有分配给任何参数,因为没有定义其他参数。