1

这部分代码出现以下错误:

[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
4

2 回答 2

1

self 为 nil,那么如何调用cooked()?它必须是 self.cooked(self) 或 self:cooked(),其中 self 是您想在函数中用作 self 的表。

于 2014-06-18T09:12:12.367 回答
1

目前还不清楚self应该是什么。该错误说它是一个全局的,这与您显示的代码一致。

但是,self几乎专门用作函数的形式参数和隐式参数。

self是隐式时,该函数被称为方法,因为它的意图是访问传递给的表中的字段self。方法值几乎总是由同一个表中的一个字段保存(或者至少可以通过元方法获得)。

函数定义中的冒号语法创建一个方法。

如果cooked是一种方法,那么它访问self. 但是cooked是全球性的。

你的意思可能是:

function sometable:cooked()
-- ...
-- self is an implicit formal parameter
-- ...
end

如何阅读上面的 Lua 语句:

  1. 以表格形式访问 sometable
  2. 为其“cooked”字段分配由函数定义创建的函数值。

(函数定义是从方法语法编译而来的,所以在body中,self是第一个形参,是隐式的。)

该方法可以像这样调用:

sometable:cooked() -- passes sometable as self

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

如何阅读上面的 Lua 语句:

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

奇事:

  • 方法的语法只是“语法糖”。方法值与其他函数值没有什么不同:
    • 可以使用任何函数调用语法调用使用 any 语法从函数定义创建的函数。
      • 不需要使用方法调用语法来调用方法。
      • 可以使用方法调用语法来调用非方法。
  • self不是保留的,因此它可以像任何标识符一样使用。
于 2014-06-20T01:56:24.257 回答