2009-08-12 135 views
6

我正在嘗試編寫一個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時遇到此錯誤?

+0

出於好奇,你在修改什麼遊戲? – 2009-08-12 19:08:20

+0

一箇舊的,實際上是一個修改。星際迷航艦隊2艦隊作戰。它在www.fletops.net – RCIX 2009-08-12 19:25:16

+0

+1爲一個很好提出的問題。 – RBerteig 2009-08-12 19:52:37

回答

5

至少在你的測試代碼,你有一個錯字:

line1data ~= line1Data 

您還可以在ioWriter.lua一個錯字在關閉方法:

function ioWriter:close(self) 

應該

function ioWriter:close() 
+0

謝謝,爲什麼我沒有看到那些?經典的程序員錯誤再次發生.... – RCIX 2009-08-12 23:59:40

1

您尚未明確檢查是否所有執行odf:open()的操作都成功。我擔心的是,看起來好像odf:open()中的整個流量控制似乎都假設一切都成功了。是否有可能沒有,並且因此在指示的線上,錯誤是由試圖索引self.writer包含nil引起的?

它可能是nil而不是false如果odfWriter:open()未成功執行構造函數self.writer = ioWriter()例如。我不是一個循環的普通用戶,所以我可能會吠叫錯誤的樹,但...

如果發生這種情況,很容易得到一個混淆了哪個索引是錯誤的消息。

也許在幾個選擇地點撥打電話assert()會很有成效。

相關問題