关于何时使用 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,它抱怨说我在 update
和 exit
方法中不必要地使用了冒号。我这样做的原因是为了保持我所有的方法统一。有时我需要 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)
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
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)