Lua试图索引全球“自我”错误(GMod Lua脚本)

时间:2014-06-18 09:07:49

标签: lua garrys-mod

我在这部分代码中遇到以下错误:

[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

2 个答案:

答案 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声明:

  1. 以桌子形式访问sometable
  2. 为其“cooked”字段分配函数定义创建的函数值。
  3. (函数定义是从方法语法编译的,所以在正文中,self是第一个形式参数,它是隐含的。)

    该方法可以被称为:

    sometable:cooked() -- passes sometable as self
    

    字段函数调用中的冒号语法是方法调用。

    如何阅读上面的Lua声明:

    1. 以表格形式访问sometable,
    2. 索引其“熟”字段,
    3. 将其值作为函数调用,将sometable作为第一个参数传递,
    4. 丢弃结果列表。

    5. 奇怪:

      • 方法的语法只是“语法糖”。方法值与其他函数值没有区别:
        • 可以使用任何函数调用语法调用使用any语法从函数定义创建的函数。
          • 无需使用方法调用语法调用方法。
          • 可以使用方法调用语法调用非方法。
      • self未保留,因此可以用作任何标识符。