0

所以,我正在尝试在 Lua 中编写一个简单的类来表示 CSV 字段:

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

2 回答 2

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


旁注:arg可变参数函数的隐式参数在 Lua 5.1(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
于 2012-06-06T21:47:10.670 回答
0

我重写了你的代码以满足它的用途,它对我来说运行正常:

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 所说,代码中的 create(...) 只是一个常规调用,并从...返回所有参数,如果您希望 csv_entry 像一个类一样工作,那么您必须将设置 metatable 和 __index 的代码放入create(...),并从 csv_entry 类返回一个实例

于 2014-03-27T06:03:10.613 回答