我运行了这段代码,它让我错误地尝试索引全局' self' (零值)
hook.Add("Think", "Cooking", function()
local Position = self:GetPos() + self:GetAngles():Up()*20
local rawFood = ents.FindByName("my_raw_food")
for k, v in pairs(rawFood) do
if(Position:Distance(v:GetPos()) <= 25) then
v:Remove()
timer.Create(self:EntIndex() .. "my_food", 5, 1, function() self:createFood() end)
end
end
end )
答案 0 :(得分:6)
如果没有看到更多代码,特别是代码范围,很难说。
但听起来像是&#34;自我&#34;范围内不存在。它应该作为参数提供给函数:
hook.Add("Think", "Cooking", function(self)
print(self) -- uses the 'self' parameter
end)
或者它应该在声明函数的范围内可用,并且它将成为闭包的一部分:
function MyClass.addHook(self) -- same as MyClass:addHook()
hook.Add("Think", "Cooking", function()
print(self) -- uses the 'self' in scope (la MyClass instace)
end)
虽然,self
当然可以nil
,即使它已在范围内声明。最常见的是拨打MyClassInstance.addHook()
而不是MyClassInstance:addHook()
。
答案 1 :(得分:1)
self ,如文档16 - Object-Oriented Programming中所述。
为了使用self,你必须隐式地将它作为第一个参数传递。
我的意思是......
myObject = { id = 1 }
function myObject:hello( name )
print( "hello " .. name .. " I'm object id : " .. tostring( self.id ) )
end
// Using the . char the object must be the first argument
myObject.hello( myObject, "world" )
// Using the : char the obect is automatically set as the first arg
myObject:hello( "world" )
所以在你的代码中,我猜你应该使用:char。
hook:add(...)