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,它提示我在 update
和 exit
方法中不必要地使用了冒号。我这样做的原因是为了保持所有方法的统一。有时我需要self
,有时则不需要。
但总的来说,在这些上使用冒号有什么好处吗?似乎如果我有类似 State:start
的东西,那么我可以直接引用 State
。我可以做 State.attackTimer
与 self.attackTimer
..
为什么你真的需要冒号?如果您有权访问保存该方法的表,那么您就可以访问 self.. 对吗?
最佳答案
:
当您使用表和元表创建类时,语法是一个很好的工具。
上面的代码不是创建一个类,而是创建一组封装的函数。可以访问 State
作为升值。
我将使用 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)
这里我们有一个 acc
的实例( Account
)类(class)。调整或修改Account
此特定实例中的值我们无法引用Account.balance
Account:withdraw
里面。我们需要对存储数据的表的引用,即使用 :
传递该表的位置。进来。
acc:withdraw(100)
只是 acc.withdraw(acc, 100)
的语法糖传入我们的表作为第一个参数 self
。当您定义Account:withdraw(amount)
时有一个隐含的第一个变量 self
定义可以写成Account.withdraw(self, amount)
关于oop - 关于何时使用lua冒号语法的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57778966/