Je suis nouveau à Lua et j'ai juste essayé de faire quelque chose de commun et simple dans d'autres langages mais qui ne fonctionne pas de la même manière dans Lua en raison des paramètres des fonctions passées par référence (je suppose) . Ajoutant aussi des choses aux tables est fait par référence aussi il semble. Pseudo-code:Comment est-ce que je fais l'équivalent de passer des paramètres par valeur dans Lua?
objImage --stores details about each image like name, iso, aperture etc.
tblMetadata --table that has all the image names and associated data.
tblImages --table to hold the image objects (objImage)
for each line in tblMetadata
objImage.name = blahblah
objImage.iso = blahblah
etc...
table.insert(tblImages, objImage)
objImage = nil
end
Dans la plupart des langues que je l'ai utilisé, objImage = nil
(ou l'équivalent) remet à zéro l'objet pour permettre une nouvelle image à ajouter à la table. Mais dans Lua, il place l'objet juste ajouté à la table à zéro. Quelle est la technique pour ajouter une série d'objets à une table de manière itérative comme ceci? J'ai essayé d'utiliser une deuxième objImage (objImage2) et en lui affectant objImage avant de l'ajouter (objImage2) à la table, mais cela assigne juste un pointeur/référence à l'objImage original.
Edit: Mon code pseudo ne reflète pas pleinement ce que je suis en train de le faire, donc je l'ai ajouté le code réel ci-dessous:
function extractExif(tblOutput)
local tblImages = {}
local blnFlag = false
local intCount = 0
local Image = {} --pseudo object to hold metadata for each image
for k,v in pairs(tblOutput) do --iterate through each value in the table
if string.find(v, "^=.+") then
--test if new image other than the first one
if blnFlag == true then
--add Image to tblImages and then clear Image object
table.insert(tblImages, Image)
Image = nil
blnFlag = false
end
i, j = string.find(v, "/") -- **** MAC ONLY. Back slash for Windows *****
Image.filePath = string.sub(v, i) --returns the file path
--Image.name = string.match(v, "([^/]+)$") --return the file name
blnFlag = true
elseif string.find(v, "ISO") ~= nil then
Image.iso = string.match(v, "%a+:(.+)") --get text (i.e value) to right of colon
elseif string.find(v, "Film") ~= nil then
Image.filmSim = string.match(v, "%a+:(.+)")
elseif string.find(v, "Setting") ~= nil then
Image.drMode = string.match(v, "%a+:(.+)")
elseif (string.find(v, "Auto") ~= nil) or (string.find(v, "Development") ~= nil) then -- corresponds to "Auto Dynamic Range" and "Development Dynamic Range" in fuji exif
Image.dr = string.match(v, "%a+:(.+)")
else
end
end
end
je peux de programme de cours ce mieux en utilisant une table imbriquée ou similaire au lieu d'une liste de métadonnées tblOutput plat, et je le ferai probablement à un moment donné.
est ce code correct? qu'est-ce que la variable 'objTable'? peux-tu coller du vrai code? – pkisztelinski
Désolé, cela devrait être objImage. Je l'ai corrigé. – erv