我一直在Lua闲逛,以查找为什么以及如何在Lua中定义“类”时得到“试图调用字段'copy'(nil值)”。
local factionClass = {}
factionClass.Name = "throwaway"
function factionClass:New(name)
local newFaction = table.Copy(factionClass)
if name then
newFaction.Name = name
end
return newFaction
end
factionCoolguys = Faction("cool guys")
答案 0 :(得分:4)
Lua没有对象或类的概念;它们通常以包含函数的表的形式实现。
该错误的原因与它所说的完全一样:您正在尝试调用nil。
您尝试调用的函数table.copy
,does not exist,因此Lua在尝试调用该函数时会抱怨。这是因为:
如果未定义内容,则为nil
,它是有效的“值”,与C之类的语言不同,C语言中不存在未定义的变量。尽管nil
无法调用,这会导致您出错。
在几乎所有情况下,“尝试调用字段X(无值)”应理解为“尝试调用不存在的函数(X)”,这将是更易于理解的错误消息。
不是将类的内容复制到新实例中,而是在Lua中使用metatables查找类中对象中不存在的键。有关更多信息,请参见Programming in Lua。