2009-08-12 17 views
6

Tôi đang cố viết một kịch bản lệnh để hỗ trợ sửa đổi trò chơi và nó tiếp tục vi phạm trên một dòng cụ thể của một trong các thư viện trợ lý của tôi.Cố gắng lập chỉ mục giá trị nil trong tập lệnh

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: Mã

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 

kiểm tra:

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() 

Tại sao tôi gặp lỗi này khi tôi chuyển rõ ràng trong một bảng hợp lệ để odfwriter.write?

+0

Chỉ vì tò mò, bạn đang sửa đổi trò chơi nào? –

+0

Một cũ, thực sự là một sửa đổi một. Hoạt động Hạm đội Star Trek Armada 2. Đó là tại www.fletops.net – RCIX

+0

+1 cho câu hỏi được trình bày kỹ lưỡng. – RBerteig

Trả lời

5

Ít nhất trong mã thử nghiệm của bạn, bạn có một typo:

line1data ~= line1Data 

Bạn cũng có một lỗi đánh máy trong ioWriter.lua trong phương pháp chặt chẽ:

function ioWriter:close(self) 

nên

function ioWriter:close() 
+0

Cảm ơn vì sao tôi không thấy chúng? lỗi lập trình viên cổ điển lại xảy ra .... – RCIX

1

Bạn chưa kiểm tra rõ ràng rằng mọi thứ triển khai odf:open() đã thành công. Mối quan tâm của tôi là có vẻ như toàn bộ kiểm soát luồng trong số odf:open() dường như cho rằng mọi thứ đã thành công. Có thể là nó không, và kết quả là tại dòng chỉ ra lỗi là do cố gắng để chỉ số self.writer chứa nil?

Có thể là nil thay vì false nếu odfWriter:open() không thực thi thành công hàm tạo self.writer = ioWriter() chẳng hạn. Tôi không phải là người dùng thường xuyên của vòng lặp, vì vậy tôi có thể sủa cây sai, nhưng ...

Nếu điều đó xảy ra, sẽ dễ dàng nhận được thông báo nhầm lẫn về chỉ mục nào có lỗi .

Có thể việc thực hiện các cuộc gọi đến assert() ở một số điểm lựa chọn sẽ hiệu quả.

Các vấn đề liên quan