我如何做等效于在Lua中按值传递参数?

时间:2017-06-17 10:32:06

标签: for-loop lua lua-table

我是Lua的新手,我只是尝试在其他语言中做一些常见且直截了当的事情,但由于函数的参数传递而在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

在我使用的大多数语言中,objImage = nil(或等效的)重置对象以允许将新图像添加到表中。但在Lua中,它将刚刚添加到表中的对象设置为nil。添加一系列'对象的技术是什么?像这样的迭代方式到表?我尝试使用第二个objImage(objImage2)并在将它(objImage2)添加到表之前为其分配objImage,但这只是指向原始objImage的指针/引用。

编辑:我的伪代码并没有完全反映我要做的事情,所以我已经添加了下面的实际代码:

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

我当然可以通过使用嵌套表格而不是平坦的tblOutput元数据列表来更好地编程,我可能会在某些时候。

2 个答案:

答案 0 :(得分:3)

可能您必须使用空表而不是objImage值重置nil

例如:

local objImage = {}
local tblMetadata = {'foo', 'bar', 'biz'}
local tblImages = {}

for k, v in ipairs(tblMetadata) do
  objImage.name = v
  objImage.iso = v
  table.insert(tblImages, objImage)
  objImage = {}
end

答案 1 :(得分:1)

for each line in tblMetadata
  -- Create new LOCAL empty instance
  local objImage = {}
  -- Fill the data
  objImage.name = blahblah
  objImage.iso = blahblah
  etc...
  table.insert(tblImages, objImage)
  -- There is no need for assigning nil to variable objImage
  -- objImage is being garbage-collected automatically as it goes out of scope
end