[英]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
返回nil
而c: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.