2012-06-06 74 views
0

所以,我試圖寫在Lua一個簡單的類來表示CSV字段:試圖調用方法「打印」(一個零值)時實現OOP在Lua

csv_entry = {} 
csv_entry.__index = csv_entry 

function csv_entry.create(...) 
    return arg 
end 

function csv_entry:tostring() 
    local str = string.char() 
    for i,v in ipairs(self) do 
     if i < #self then 
    str = str .. v 
     else 
    str = str .. v .. ", " 
     end 
    end 
end 

function csv_entry:print() 
    print(self:tostring()) 
end 

但是,當我嘗試使用這個類是這樣的:

c = csv_entry.create("Volvo", 10000, "Eric") 
c:print() -- line 25 

我得到錯誤信息

lua: csv.lua:25: attempt to call method 'print' (a nil value) 

而且我真的不能在這裏找出問題。我究竟做錯了什麼?

+4

您的'create'函數似乎沒有做任何事情。它返回'arg',這是nil。還是有更多的事情發生,你沒有顯示? –

回答

3

你大概的意思做的是:

function csv_entry.create(...) 
    return setmetatable(arg, csv_entry) 
end 

您發佈的cvs_entry.create版本只是返回它包裝成一個表參數,所以這段代碼:

c = csv_entry.create("Volvo", 10000, "Eric") 
c:print() 

完全等同到此代碼:

c = {"Volvo", 10000, "Eric"} 
c:print() 

c不包含print條目,因此c.print返回nilc:print()失敗,因爲您試圖「呼叫」nil


邊注:在Lua 5.1去除隱含arg參數可變參數的函數(6年前)。現在這樣做的正確的方法是:

function csv_entry.create(...) 
    local arg = {...} 
    return setmetatable(arg, csv_entry) 
end 

或者乾脆:

function csv_entry.create(...) 
    return setmetatable({...}, csv_entry) 
end 

只要我們在這裏:你會從csv_entry:tostring得不到任何輸出,因爲它不沒有任何回報。另外,如果你正在試圖做的一切是連接用逗號分隔符一堆物品,你可以使用table.concat

function csv_entry:tostring() 
    return table.concat(self, ', ') 
end 
0

我重寫代碼,以滿足它是什麼,它運行我OK:

csv_entry = {} 

function csv_entry:create(...) 
    o = {content = {}} 
    self.__index = self; 
    setmetatable(o, self) 
     for i = 1, arg.n do 
      o.content[i] = arg[i]; 
     end 
    return o; 
end 

function csv_entry:tostring() 
    local resStr = "" 
    for i, v in pairs(self.content) do 
     resStr = resStr .. v; 
     if i < #(self.content) then 
      resStr = resStr .. ", " 
     end 
    end 
    return resStr; 
end 

function csv_entry:print() 
    print(self:tostring()) 
end 

c = csv_entry:create("Volvo", 10000, "Eric") 
c:print() 

像@Mud表示,創建(...)在你的代碼只是一個普通的通話,然後從...返回所有的參數,如果你想csv_entry就像一個類,那麼你必須把代碼將metatable和__index設置爲create(...),並從csv_entry類返回實例

相關問題