Как искать в таблице член другой таблицы в Lua - PullRequest
2 голосов
/ 13 мая 2019

Я пишу программу 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

1 Ответ

4 голосов
/ 13 мая 2019

Я думаю, вы неправильно понимаете, что вы должны вставить в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...