Lua 中点号和冒号操作符的备忘

分两种情况来看

函数定义

冒号默认会隐式 接收 一个 self 参数,使用点号则需要显示传入 self

函数调用

冒号默认会隐式 传入 一个 self 参数,点号只是普通调用

案例

local _M = { _VERSION = "0.0.1" }

function _M.new(self, o)
    o = o or {}
    setmetatable(o, {__index = self})
    return o
end

function _M:foo(arg1, arg2)
    ngx.say(self._VERSION)
    ngx.say(arg1)
    ngx.say(arg2)
    ngx.say("--------")
end

function _M:bar()
    self.foo("arg1", "arg2")
    self.foo(self, "arg1", "arg2")
    self:foo("arg1", "arg2")
end

local ins = _M:new() -- 默认带入了 self 参数

ins.foo("arg1", "arg2")
-- 因为 foo 函数会默认接收 self, arg1 传给了 self,所以第一个参数会输出 nil
-- nil
-- arg2
-- nil

ins.foo(ins, "arg1", "arg2") -- 这样就 OK 了
-- 0.0.1
-- arg1
-- arg2

ins:foo("arg1", "arg2") -- 输出符合预期
-- 0.0.1
-- arg1
-- arg2

ins:bar() -- 同样的输出

标签: lua, openresty

添加新评论