我正在编写一个lua程序,该程序具有一个表,该表是另一个表的成员。当我向该成员表添加新日期时,一切正常。但是,当我想在该表中进行搜索时,无论我给出什么键,我总是得到添加到表中的最后一行。如何在该成员表中正确搜索?
Stream = {name = ""}
function Stream:new(obj, name)
obj = obj or {}
setmetatable(obj, self)
self.__index = self
self.name = name or "default"
--[[ declaration and initialization of another table memebers--]]
return obj
end
Table = {streams = {}}
function Table:new(obj)
obj = obj or {}
setmetatable(obj, self)
self.__index = self
self.streams = {}
--[[ declaration and initialization of another table memebers--]]
return obj
end
table_ = Table:new(nil)
table_.streams["stdout"] = Stream:new(nil,"stdout")
table_.streams["stderr"] = Stream:new(nil,"stderr")
print("Stdout stream name:", table_.streams["stdout"].name)
print("Stream table content:")
for k, v in pairs(table_.streams) do
print(k, v)
end
我希望输出为:
Stdout stream name: stdout
但是我得到:
Stdout stream name: stderr
答案 0 :(得分:3)
我认为您误解了在obj
函数中应该放在self
中的内容以及应该在:new
中放置的内容。您自己输入的内容最终会在通过:new
函数创建的所有对象之间共享。您可能需要查找有关元表的更多信息。这是一个演示
local t = {}
function t:new(name)
local obj = {
Name = name
}
setmetatable(obj, self)
self.__index = self
self.SharedName = name
return obj
end
local o1 = t:new("a")
print(o1.Name) -- a
print(o1.SharedName) -- a
local o2 = t:new("b")
print(o1.Name) -- a
print(o1.SharedName) -- b
-- after creating second object SharedName field was overwritten like in your case
print(o2.Name) -- b
print(o2.SharedName) -- b