2013-06-17 2 views
-1

Я хотел бы знать, как заставить новое ассигнование в цикле:Как заставить новую привязку в цикле в Lua?

for file in lfs.dir(lfs.currentdir() .. "/content") do 
    if lfs.attributes(lfs.currentdir() .. "/content/" .. file, "mode") == "file" then 
     if file:sub(0, 1) ~= "." then 

      local article = Article:new(lfs.currentdir() .. "/content/" .. file) 
      table.insert(self.articles[article.lang], article) 

     end 
    end 
end 

Когда я запускаю этот кусок кода через отладчик, я могу увидеть, что переменная статью всегда имеет один и тот же адрес в памяти, так каждый элемент таблицы self.articles точно такой же.

Как я могу принудительно назначить новое пространство памяти, не удаляя старый (на кого следует ссылаться в таблице)?

Редактировать

Я в настоящее время используют 30log: https://github.com/Yonaba/30log

Статья наследует Содержание класса:

content.lua (часть)

local content = class() 
content.__name = "Content" 

function content:__init(file_path) 

    self.title = _("Untitled document") 
    -- ... other declarations like this, nothing less, nothing more 

end 

-- Some methods follow 

article.lua (полный)

local article = Content:extends() 

article.__name = "Article" 

function article:__init(file_path) 

    article.super:__init(file_path) 

end 

return article 

Edit 2

Вызов можно рассматривать "в контексте" здесь: https://github.com/martin-damien/frankenstein/blob/master/pieces/site.lua#L151

Спасибо,

Damien

+0

Если вы объявляете статью за пределами циклов и продолжаете назначать ее в цикле, она работает? – Bill

+4

Пожалуйста, разместите код функции 'Article: new'. Я подозреваю, что там ошибка (в частности, она должна установить 'self' в новую таблицу, и я предполагаю, что это не так.) – finnw

+0

@Bill Это ничего не меняет. –

ответ

1

Есть несколько проблем с кодом в вашем репозитории GitHub, но тот, который, вероятно, связан с этим вопросом, - this. Индексирование таблицы Lua начинается с 1, поэтому вы назначаете nil как язык по умолчанию для статей ...

Если я исправлю это и другие вещи, например, то, что вы не можете call a method in the constructor с 30log, ваш код «работает» (т.е. после этого цикла в соответствующей таблице есть несколько статей).

+0

https://github.com/martin-damien/frankenstein/blob/c4aafadd8f14c4e745a181b1fa9bafd5e99a1063/pieces/content.lua#L14 взять первый элемент таблицу, загруженную из файла 'settings.lua'. Таким образом, значение «nil» не имеет значения. Но удаление вызова из конструктора и перемещение его после того, как конструктор работает очень хорошо (в сочетании с более старым сообщением @finnw) –

+1

Я имел в виду, что если эта таблица выглядит как https://github.com/martin-damien/frankenstein /blob/c4aafadd8f14c4e745a181b1fa9bafd5e99a1063/frankenstein.lua#L43 не работает. 'Языки [0]' is 'nil',' languages ​​[1] 'is' "en" '... – catwell

+0

Какие проблемы вы видели в моем коде? (Я начал лечить Lua несколько месяцев назад как хобби, и я знаю, что у меня есть много чего поучиться). –

Смежные вопросы