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

Posted

技术标签:

【中文标题】Lua 尝试索引全局“自我”错误(GMod Lua 脚本)【英文标题】:Lua attempt to index global 'self' error (GMod Lua script) 【发布时间】:2014-06-18 09:07:49 【问题描述】:

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

[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

【问题讨论】:

为什么你接受了 Maze 的回答而不接受 Tom 的回答,这不仅正确而且解释了原因? 【参考方案1】:

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

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

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

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

如果cooked 是一个方法,那么它访问self 是有意义的。但是cooked 是一个全球性的。

你的意思可能是:

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

如何阅读上面的Lua语句:

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

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

方法可以这样调用:

sometable:cooked() -- passes sometable as self

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

如何阅读上面的Lua语句:

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

怪事:

方法的语法只是“语法糖”。方法值与其他函数值没有什么不同: 可以使用任何函数调用语法调用从使用任何语法的函数定义创建的函数。 不需要使用方法调用语法来调用方法。 可以使用方法调用语法调用非方法。 self 未保留,因此可以像任何标识符一样使用。

【讨论】:

【参考方案2】:

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

【讨论】:

其实函数也必须定义为function sometable:cooked()function sometable.cooked(self)

以上是关于Lua 尝试索引全局“自我”错误(GMod Lua 脚本)的主要内容,如果未能解决你的问题,请参考以下文章

Lua 脚本 - 尝试索引全局(零值)

vgui 是一个零值 Gmod

Lua GMOD自定义聊天脚本问题

我正在尝试通过 Logitech GHub 为 GMod 制作一个 lua 脚本,将玩家视图旋转 180 度,但不知道如何进行旋转

无法让 PlayerSay 在 Gmod lua 插件中工作

尝试索引全局 'io'(零值)