关于何时使用 lua 冒号语法的问题

Question about when to use lua colon syntax

local Public = {}

function Public.new(ent)
  local State = {}


  function State:update(player)
    ent:setLinearVelocity(0,0)
  end

  function State:start(player)
    ent.fixedRotation = true
    self.attackTimer = _G.m.addTimer(200, function()
      ent:setState('attacking', player)
    end)
  end

  function State:exit(player)
    ent.fixedRotation = false
    timer.cancel(self.attackTimer)
  end

  return State
end

return Public

我正在使用 linter,它抱怨说我在 updateexit 方法中不必要地使用了冒号。我这样做的原因是为了保持我所有的方法统一。有时我需要 self 有时不需要。

但总的来说,在这些上面使用冒号有什么好处吗?好像如果我有类似 State:start 的东西,那么我可以直接引用 State。我可以做 State.attackTimer vs self.attackTimer..

为什么你真的需要冒号?如果您可以访问包含该方法的 table 那么您就可以访问 self.. 对吧?

当您使用 table 和 metatable.

制作 class 时,: 语法是一个很好的工具

您上面的代码不是创建 class,而是创建一组封装的函数。可以访问 State 作为上值。

我将使用 Lua Users - SimpleLuaClasses 中的 class 作为示例:

Account = {}
Account.__index = Account

function Account:create(balance)
   local acnt = {}             -- our new object
   setmetatable(acnt,Account)  -- make Account handle lookup
   acnt.balance = balance      -- initialize our object
   return acnt
end

function Account:withdraw(amount)
   self.balance = self.balance - amount
end

-- create and use an Account
acc = Account:create(1000)
acc:withdraw(100)

这里我们有一个 Account class 的实例 (acc)。要调整或修改 Account 这个特定实例中的值,我们不能在 Account:withdraw 中引用 Account.balance。我们需要对存储数据的 table 的引用,这就是使用 : 传递 table 的地方。

acc:withdraw(100) 只是 acc.withdraw(acc, 100) 的语法糖,将我们的 table 作为第一个参数 self 传入。当你定义 Account:withdraw(amount) 时,有一个隐含的第一个变量 self 定义可以写成 Account.withdraw(self, amount)