Lua OOP带有元表,从文件加载函数时出现问题
我正在尝试将数据存储在一个足以创建元表“类”的文件中,其格式可以作为函数加载 基本思想如下: 我已经能够创建文件,并成功加载它。我知道正在读取所有数据,因为在文件正确格式化之前,我遇到了语法错误。但我无法访问数据中的字段 编辑:感谢下面的海报,他指出我需要在书面文件中引用字符串值。基于这一点,我几乎可以工作了 但是,在加载后在文件函数上设置元表仍然存在问题。每个插件对象都有几个银行,当我加载它们时,我会得到一个额外的银行子表。它要么是其中一个表的副本(并不总是相同的),有时是一个格式错误的表,没有实现tostring方法。代码如下:Lua OOP带有元表,从文件加载函数时出现问题,oop,lua,io,metatable,Oop,Lua,Io,Metatable,我正在尝试将数据存储在一个足以创建元表“类”的文件中,其格式可以作为函数加载 基本思想如下: 我已经能够创建文件,并成功加载它。我知道正在读取所有数据,因为在文件正确格式化之前,我遇到了语法错误。但我无法访问数据中的字段 编辑:感谢下面的海报,他指出我需要在书面文件中引用字符串值。基于这一点,我几乎可以工作了 但是,在加载后在文件函数上设置元表仍然存在问题。每个插件对象都有几个银行,当我加载它们时,我会得到一个额外的银行子表。它要么是其中一个表的副本(并不总是相同的),有时是一个格式错误的表,没
local Bank = {}
Bank.__index = Bank
function Bank.new(name,hue,sat,preset)
local self = setmetatable({}, Bank)
self.name = name
self.hue = hue or 0
self.sat = sat or 0
self.params = {}
self.presets = {preset} or {}
return self
end
function Bank:addPreset(name)
table.insert(self.presets,name)
end
function Bank:setParam(control,name)
self.params[control]=name
end
function Bank:getParam(control)
return self.params.name
end
function getParamStr(params)
paramT= {}
paramStr = 'params = {'
for control,param in pairs(params) do
table.insert(paramT,control..' = '..esc(param))
end
paramStr = paramStr..table.concat(paramT,',')..'},'
return paramStr
end
local Plugin = {}
Plugin.__index = Plugin
function Plugin:__tostring()
bankT = {}
plugStr = 'return {\n'..'name = '..esc(self.name)..', '
bankPre = '\n banks = {\n '
for bankName in pairs(self.banks) do
table.insert(bankT,tostring(self.banks[bankName]))
end
return plugStr..getParamStr(self.params)..bankPre..table.concat(bankT,',\n ')..'\n }\n'..'}'
end
function Bank:__tostring()
rtnStr = ' '..self.name..' = { '..'name = '..esc(self.name)..', hue = '..self.hue..', sat = '..self.sat..', '
..getParamStr(self.params)..'\n'
..' presets = {\"'..table.concat (self.presets,'\", \"')..'\" }\n'
..' }'
return rtnStr
end
function Plugin.new(vstName)
local self = setmetatable({}, Plugin)
self.name = vstName
self.params = {}
self.banks = {}
return self
end
function Plugin:getPresetList()
return table.sort(self.presets)
end
function Plugin:addBank(bankName,hue,sat,preset)
--just quietly overwrite any existing bank? for now...
self.banks[bankName] = Bank.new(bankName,hue,sat,preset)
end
function Plugin:addPresetToBank(bankName,preset)
self.banks[bankName]:addPreset(preset)
end
function Plugin:getBank(bank)
return self.banks[bank]
end
function Plugin:setColor(hue,sat)
self.hue = hue
self.sat = sat
end
function Plugin:getColor(level)
return 'hue: '..self.hue..' and sat: '..self.sat
end
function Plugin:setParam(control,name)
self.params[control]=name
end
function Plugin:getParam(control)
--print(self.params.control)
return self.params[control]
end
function Bank.init(data)
local self = setmetatable(data,Bank)
return self
end
function Plugin.load(filename)
local f = assert(loadfile('c:\\lua\\'..filename..'.lua'))
data = f()
local self = setmetatable(data,Plugin)
for bankName,table in pairs(self.banks) do
self.banks.bankName = Bank.init(table)
end
return self
end
function Plugin:save()
filename = 'c:\\lua\\'..self.name..'.lua'
local file = io.open(filename,'w')
file:write(tostring(self))
file:close()
end
function Plugin.test(name)
plug = Plugin.new(name)
plug:setColor(120,.08)
plug:setParam('A1','Reverb')
plug:setParam('A2','Chorus')
plug:addBank('favorites',120,.05,'Ice Bell')
plug:addBank('pianos',10,.09,'Black')
plug:addPresetToBank('pianos','Grandeur')
plug:addPresetToBank('favorites','OB pad')
curBank = plug:getBank('favorites')
curBank:setParam('A5','Wah')
plug:getBank('pianos'):setParam('A1','Reverb')
return plug
end
plugName = 'test'
plug = Plugin.test(plugName)
plug:save()
plug2 = Plugin.load(plugName)
print(plug2)
plug2.name = 'test2'
plug2:save()
生成的数据文件如下所示:
return {
name = "test", params = {A1 = "Reverb",A2 = "Chorus"},
banks = {
favorites = { name = "favorites", hue = 120, sat = 0.05, params = {A5 = "Wah"},
presets = {"Ice Bell", "OB pad" }
},
pianos = { name = "pianos", hue = 10, sat = 0.09, params = {A1 = "Reverb"},
presets = {"Black", "Grandeur" }
}
}
}
return {
name = "test2", params = {A1 = "Reverb",A2 = "Chorus"},
banks = {
table: 00e8eae0,
favorites = { name = "favorites", hue = 120, sat = 0.05, params = {A5 = "Wah"},
presets = {"Ice Bell", "OB pad" }
},
favorites = { name = "favorites", hue = 120, sat = 0.05, params = {A5 = "Wah"},
presets = {"Ice Bell", "OB pad" }
}
}
}
但加载后,我得到如下结果:
return {
name = "test", params = {A1 = "Reverb",A2 = "Chorus"},
banks = {
favorites = { name = "favorites", hue = 120, sat = 0.05, params = {A5 = "Wah"},
presets = {"Ice Bell", "OB pad" }
},
pianos = { name = "pianos", hue = 10, sat = 0.09, params = {A1 = "Reverb"},
presets = {"Black", "Grandeur" }
}
}
}
return {
name = "test2", params = {A1 = "Reverb",A2 = "Chorus"},
banks = {
table: 00e8eae0,
favorites = { name = "favorites", hue = 120, sat = 0.05, params = {A5 = "Wah"},
presets = {"Ice Bell", "OB pad" }
},
favorites = { name = "favorites", hue = 120, sat = 0.05, params = {A5 = "Wah"},
presets = {"Ice Bell", "OB pad" }
}
}
}
不确定“幻影”表是从哪里来的。。。我还没有弄清楚如何避免在文件中重复银行名称,但这不是什么大问题
提前感谢 编辑1:
将我的字段设置为实际字符串,并将Plugin init方法更改为:
function Plugin.init(data)
self = setmetatable(data,Plugin)
return self
end
似乎工作正常
编辑2:
奇怪银行表的问题是插件中的语法错误。加载方法:
self.banks.bankName = Bank.init(table) --sort of worked??
self.banks[bankName] = Bank.init(table) --good
如果有人能解释为什么前者会带来不可预测的结果,那就很有意思了。这对我来说并不明显。但现在效果很好
编辑1:
将我的字段设置为实际字符串,并将Plugin init方法更改为:
function Plugin.init(data)
self = setmetatable(data,Plugin)
return self
end
似乎工作正常
编辑2:
奇怪银行表的问题是插件中的语法错误。加载方法:
self.banks.bankName = Bank.init(table) --sort of worked??
self.banks[bankName] = Bank.init(table) --good
如果有人能解释为什么前者会带来不可预测的结果,那就很有意思了。这对我来说并不明显。但现在效果很好
文件是否返回任何内容?您似乎将两个文件粘在一起,就像它们是一个文件一样?那不行。请显示两个单独的文件。这是一个文件。我将更新帖子以包含创建的数据文件。您的字符串没有
“
在它们周围,因此name=kontakt
与name=nil
相同,因为kontakt
没有定义。啊,谢谢!!!文件是否返回任何内容?您似乎将两个文件粘在一起,就像它们是一个文件一样?那不行。请显示两个单独的文件。这是一个文件。我将更新帖子以包含创建的数据文件。您的字符串周围没有“
,因此name=kontakt
与name=nil
相同,因为kontakt
未定义。啊,谢谢!!!