【问题标题】:Attempt to index a nil value in a script尝试在脚本中索引 nil 值
【发布时间】:2010-11-19 01:54:01
【问题描述】:

我正在尝试编写一个 lua 脚本来帮助修改游戏,但它一直在我的一个助手库的一个特定行上中断。

odfWriter.lua:

require 'loopsetup'
require 'ioWriter'
local open = {}
odfWriter = class{
    writer = false
}
odfWriter[open] = false

function odfWriter:open(name)
    if not self[open] then
        self.writer = ioWriter()
        self.writer:open(name)
        self[open] = true
    else
        error("tried to open an already open writer")
    end
end

function odfWriter:write(args)
    self.writer:write(args.Key .. " = ") --<-- error is here, when trying to access args
    if args.Type == "seqstrings" then
        for k,v in pairs(args.Value) do
            self.writer:write("\"" .. v .. "\" ")
        end
    elseif args.Type == "string" then
        self.writer:write("\"" .. args.Value .. "\"")
    elseif args.Type == "seqnumbers" then
        for k,v in pairs(args.Value) do
            self.writer:write(tostring(v) .. " ")
        end
    elseif args.Type == "number" then
        self.writer:write(tostring(args.Value))
    elseif args.Type == "boolean" then
        if args.Value == true then
            self.writer:write("1")
        elseif args.Value == false then
            self.writer:write("0")
        end
    end
    self.writer:write("\n")
end
function odfWriter:close()
    if self[open] then
        self.writer:close()
        self.writer = false
        self[open] = false
    else
        error("tried to close an already closed writer")
    end
end

loopSetup.lua

-----------------------------------------------------------------------
--  file        : loopsetup.lua
--  description : provides global access to all of the (known) members
--                of the loop.simple code (for easier access)
-----------------------------------------------------------------------
require 'loop.simple'
class = loop.simple.class
classof = loop.simple.classof
initclass = loop.simple.initclass
instanceof = loop.simple.instanceof
isclass = loop.simple.isclass
memberof = loop.simple.memberof
members = loop.simple.members
new = loop.simple.new
rawnew = loop.simple.rawnew
subclassof = loop.simple.subclassof
superclass = loop.simple.superclass

ioWriter.lua:

local loaded = require('loopsetup')
assert(loaded, 'loopsetup not loaded')
local open = {}
ioWriter = class{
    stream = false
}
ioWriter[open] = false
function ioWriter:open(name)
    if not self[open] then
        self.stream = io.open(name, "w")
        self[open] = true
    else
        error("attempted to open an already open writer")
    end
end
function ioWriter:write(str)
    self.stream:write(str)
end
function ioWriter:writeLine(str)
    self.stream:write(str .. '\n')
end
function ioWriter:close(self)
    if self[open] then
        self.stream:flush()
        self.stream:close()
        self.stream = false
        self[open] = false
    else
        error("attempted to close an already closed writer")
    end
end

测试代码:

require 'loopsetup'
require 'odfWriter'
local odf = odfWriter()
odf:open('test.odf')
local line1Data = {
    Type = "seqstrings",
    Key = "engineTargetHardpoints",
    Value = {"hp01", "hp02", "hp03"}
}
odf:write(line1data)
odf:close()

当我清楚地将有效表传递给 odfwriter.write 时,为什么会出现此错误?

【问题讨论】:

  • 只是出于好奇,你在修改什么游戏?
  • 一个旧的,实际上是对一个的修改。星际迷航无敌舰队 2 舰队行动。它位于 www.fletops.net
  • +1 提出了一个很好的问题。
  • 我必须记住,最少的描述 + 大量的代码 + 胶水 = 很棒的展示! :D
  • @RCIX,它确实击败了过于常见的问题模式,即“它不起作用。为什么?”测试代码总是好的。

标签: lua


【解决方案1】:

至少在您的测试代码中,您有一个错字:

line1data ~= line1Data

你在 ioWriter.lua 的 close 方法中也有一个错字:

function ioWriter:close(self)

应该是

function ioWriter:close()

【讨论】:

    【解决方案2】:

    您尚未明确检查实现odf:open() 的所有操作是否成功。我担心的是,odf:open() 中的整个流程控制似乎都假设一切都成功了。有没有可能它没有,结果表明错误是由于尝试索引包含nilself.writer 而引起的?

    例如,如果odfWriter:open() 没有成功执行构造函数self.writer = ioWriter(),它可能是nil 而不是false。我不是循环的普通用户,所以我可能会叫错树,但是...

    如果发生这种情况,很容易收到一条消息,让人对哪个索引出了问题感到困惑。

    也许在几个选择的地方放弃对assert() 的呼叫会很有成效。

    【讨论】:

      猜你喜欢
      • 2016-05-09
      • 1970-01-01
      • 1970-01-01
      • 2019-03-01
      • 1970-01-01
      • 2014-06-25
      • 2022-10-13
      • 2019-10-10
      • 2018-01-12
      相关资源
      最近更新 更多