尝试对全局变量的 '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 )
点赞
用户4374678
用户4374678

很难在不看更多代码以及你代码周围的作用域的情况下做出判断。

但是听起来好像“self”在作用域中不存在。它可以作为参数传递给函数:

hook.Add("Think", "Cooking", function(self)
  print(self)    -- 使用 self 参数
end)

或者在声明函数的作用域中可用,并且它将成为闭包的一部分:

function MyClass.addHook(self)    -- 与 MyClass:addHook() 相同
  hook.Add("Think", "Cooking", function()
    print(self)    -- 使用作用域中的 "self" (即 MyClass 实例)
  end)

然而,即使在作用域中声明了 "self",它也可以为nil。 调用 MyClassInstance:addHook() 而非 MyClassInstance.addHook() 是最常见的错误。

2014-12-19 08:52:43
用户1479549
用户1479549

self 在面向对象编程中被用于描述于文档16 - 面向对象编程

为了使用self,你必须隐式地将它作为第一个参数传递或不传。

我是说...

myObject = { id = 1 }
function myObject:hello( name )
  print( "hello " .. name .. " I'm object id : " .. tostring( self.id ) )
end

// 使用 . 字符,对象必须作为第一个参数
myObject.hello( myObject, "world" )

// 使用 : 字符,对象会自动设置为第一个参数
myObject:hello( "world" )

因此在你的代码中,我猜你应该使用 : 字符。

hook:add(...)
2014-12-19 10:08:05