我在这部分代码中遇到以下错误:
[ERROR] lua/entities/cook/init.lua:58: attempt to index global 'self' (a nil value)1. cooked - lua/entities/cook/init.lua:58
该函数从第57行开始,当我删除第58行(local Pos = self.Entity:GetPos()
时,它只为第61行提供了相同的错误消息。
function cooked()
local Pos = self.Entity:GetPos()
local roll = math.random(1, 5);
if roll == 5 then
self.Entity:EmitSound("phx/explode06.wav")
self.Entity:Remove()
else
local createfood = ents.Create("food")
createfood:SetPos(Pos + Vector(0,10,100))
createfood:Spawn()
self:SendLua("GAMEMODE:AddNotify(\"You finish cooking the food and package the product!\", NOTIFY_GENERIC, 4)")
end
end
答案 0 :(得分:1)
自我是零,所以你如何称为cooked()? 它必须是self.cooked(self)或self:cooked(),其中self是你想在函数中用作self的表。
答案 1 :(得分:1)
目前还不清楚self
应该是什么。该错误表明它是全局的,这与您显示的代码一致。
但是,self
几乎只用作函数的形式参数,也可以用作隐式参数。
当隐式self
时,该函数称为方法,因为 intent 用于访问传递到self
的表中的字段。方法值几乎总是由同一个表中的字段保存(或至少通过元方法可用)。
函数定义中的冒号语法会创建一个方法。
如果cooked
是一种方法,那么访问self
是有意义的。但cooked
是全球性的。
你可能意味着:
function sometable:cooked()
-- ...
-- self is an implicit formal parameter
-- ...
end
如何阅读上面的Lua声明:
(函数定义是从方法语法编译的,所以在正文中,self
是第一个形式参数,它是隐含的。)
该方法可以被称为:
sometable:cooked() -- passes sometable as self
字段函数调用中的冒号语法是方法调用。
如何阅读上面的Lua声明:
奇怪:
self
未保留,因此可以用作任何标识符。