Lua试图索引全局变量“self”错误(GMod Lua脚本)

我在这段代码的这一部分一直得到以下错误信息:

[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
点赞
用户3540071
用户3540071

Selfnil,那么如何调用 cooked() 函数呢?必须使用 self.cooked(self) 或者 self:cooked(),其中 self 是你要在函数中使用作为 self 的表格。

2014-06-18 09:12:12
用户2226988
用户2226988

现在不清楚 self 应该是什么。错误提示中说它是一个全局变量,这与你展示的代码是一致的。

然而 self 几乎只用作于函数的形式参数,而且是隐式的。

self 是隐式的时,该函数被称作一个方法,因为它的 意图 是为了访问 self 传入的表 中的字段。该方法值几乎总是在同一表格中的一个字段中保存(或者说,可以通过元方法以此方式获得)。

在一个函数定义中,冒号语法会创建一个方法。

如果 cooked 是一个方法,那么使用 self 会很有意义。 但是 cooked 是一个全局变量。

你可能是想要这样:

function sometable:cooked()
-- ...
-- self 是一个隐式的形式参数
-- ...
end

解读上述的 Lua 语句:

  1. 将 sometable 视为一个表格
  2. 为其 "cooked" 字段分配函数定义所创建的函数值。

(该函数定义已从方法语法编译,因此在函数体中,self 是第一个形式参数,即隐式形式参数)

该方法可以这样调用:

sometable:cooked() --将 sometable 作为 self 传递

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

解读上述的 Lua 语句:

  1. 将 sometable 视为一个表格,
  2. 索引其 "cooked" 字段,
  3. 调用其值作为一个函数,将 sometable 作为第一个参数传递,
  4. 丢弃结果列表。

奇怪的地方:

  • 方法语法只是 "语法糖"。方法值与其他函数值没有区别:
    • 使用任何函数调用语法都可以调用使用任何语法创建的函数定义的函数。
      • 并非必须使用方法调用语法来调用方法。
      • 非方法可以使用方法调用语法来调用。
  • self 不是保留字,因此它可以像任何其他标识符一样使用。
2014-06-20 01:56:24