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

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

我使用了一个语法检查器,它抱怨我在updateexit方法中不必要地使用了冒号。我这样做的原因是让所有的方法都具有统一的格式。有时我需要self,有时我不需要。

但总体而言,使用冒号有任何优势吗?如果我有像State:start这样的东西,那么我可以直接引用State。我可以用State.attackTimer代替self.attackTimer...

为什么你真正需要冒号呢?如果你有访问持有该方法的表的权限,那么你就可以访问self..对吧?

点赞
用户7396148
用户7396148

使用表格和元表制作类时,: 语法是一个很好的工具。

你的代码创建的是一组封装的函数,而不是一个类,这些函数可以访问 State 这个 upvalue。

我将使用来自 Lua Users - SimpleLuaClasses 的这个类作为例子:

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 类的实例(acc)。为了调整或修改 Account 特定实例中的值,在 Account:withdraw 中我们不能引用 Account.balance。我们需要引用存储数据的表格,这就是使用 : 传递该表格的原因。

acc:withdraw(100) 只是 acc.withdraw(acc, 100) 的一个语法糖,将我们的表格作为第一个参数 self 传递进去。当你定义 Account:withdraw(amount) 时,有一个隐式的第一个变量 self,这个定义可以被写成 Account.withdraw(self, amount)

2019-09-03 22:13:57