如何在Lua中搜索另一个表的成员表

我正在编写一个Lua程序,其中有一个表格是另一个表格的成员。当我向该成员表格添加新数据时,一切都正常。但是当我想要搜索该表格时,无论我提供什么键,我总是得到添加到表格的最后一行。我该如何正确地搜索该成员表格?

Stream = {name = ""}

function Stream:new(obj, name)
    obj = obj or {}
    setmetatable(obj, self)
    self.__index = self
    self.name = name or "default"
    --[[ 声明并初始化其他表成员--]]
    return obj
end

Table = {streams = {}}

function Table:new(obj)
    obj = obj or {}
    setmetatable(obj, self)
    self.__index = self
    self.streams = {}
    --[[ 声明并初始化其他表成员 --]]
    return obj
end

table_ = Table:new(nil)

table_.streams["stdout"] = Stream:new(nil,"stdout")
table_.streams["stderr"] = Stream:new(nil,"stderr")

print("标准输出流名:", table_.streams["stdout"].name)

print("流表内容:")
for k, v in pairs(table_.streams) do
    print(k, v)
end

我希望输出为: 标准输出流名: stdout

但是我得到的是: 标准输出流名: stderr

点赞
用户4070330
用户4070330

我认为你误解了你应该将什么放在 obj 和在 self:new 函数中。你放在 self 中的项目最终会在通过 :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

    -- 创建第二个对象后,类似于你的情况,SharedName 字段被覆盖了

    print(o2.Name) -- b
    print(o2.SharedName) -- b
2019-05-13 12:34:58