尝试在脚本中索引一个空值。

我正在尝试编写一个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,但还是出现错误?

原文链接 https://stackoverflow.com/questions/1268085

点赞
stackoverflow用户68204
stackoverflow用户68204

你还没有明确检查实现 odf:open() 的所有内容是否成功。我担心的是,odf:open() 中的整个流程控制似乎假设一切都成功了。有可能它没有成功,因此在指定的行中,错误是由尝试索引包含 nilself.writer 发生的吗?

例如,如果 odfWriter:open() 没有成功执行构造函数 self.writer = ioWriter(),那么它可能是 nil 而不是 false。我不是 loop 的常规用户,所以我可能不是在正确的方向上努力,但是...

如果这种情况发生了,就很容易得到混淆索引错误的消息。

也许在一些关键的地方放弃调用 assert() 会更有成效。

2009-08-12 20:00:49
stackoverflow用户15795
stackoverflow用户15795

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

line1data ~= line1Data

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

function ioWriter:close(self)

应该是

function ioWriter:close()
2009-08-12 20:17:37