簡體   English   中英

在Lua中實現OOP時嘗試調用方法'print'(nil值)

[英]attempt to call method 'print' (a nil value) when implementation OOP in Lua

因此,我試圖在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)

而且我真的無法在這里找出問題。 我究竟做錯了什么?

您可能打算這樣做:

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(6年前)中刪除了可變參數函數的隱式arg參數。 現在執行此操作的正確方法是:

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

我重寫您的代碼以滿足其用途,它對我來說運行正常:

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類返回一個實例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM