2012-06-06 35 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类返回实例

相关问题