尝试索引全局'self'(零值)_

时间:2014-12-19 07:20:16

标签: lua null self

我运行了这段代码,它让我错误地尝试索引全局' 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 )

2 个答案:

答案 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(...)