Lua如何做到像按值传递参数一样?

我是 Lua 的新手,我试图在其他编程语言中共同使用的某些基本操作,但由于函数参数是通过引用传递的(我假设这一点),因此在 Lua 中无法按照同样的方式工作。似乎将东西添加到表中也是通过引用进行的。伪代码:

objImage — 存储有关每个图像的详细信息,如名称、ISO、光圈等。
tblMetadata — 表格,具有所有图像名称和关联数据。
tblImages — 表格来保存图像对象(objImage)

对于 tblMetadata 中的每一行
  objImage.name = blahblah
  objImage.iso = blahblah
  等等……
  table.insert(tblImages,objImage)
  objImage=nil
end

大多数我使用过的编程语言中,objImage=nil(或等效)将对象重置为允许向表中添加新图像。但是在 Lua 中,它将刚刚添加到表中的对象设置为 nil。如何以这种迭代方式向表中添加一系列 “对象”?我尝试使用第二个对象图像(objImage2),然后将 objImage 分配给它,然后将其添加到表中(objImage2),但这只会将指针 / 引用分配给原始的 objImage。

编辑:我的伪代码并不完全反映出我想要执行的操作,因此我已添加了下面的实际代码:

function extractExif(tblOutput)
    local tblImages = {}
    local blnFlag = false
    local intCount = 0
    local Image = {}  -- 伪对象,用于保存每个图像的元数据

    for k,v in pairs(tblOutput) do  -- 逐个遍历表格中的每个值
        if string.find(v, "^=.+") then
            -- 测试是否为新图像(不包括第一个图像)
            if blnFlag == true then
            --将 Image 添加到 tblImages,然后清除 Image 对象
            table.insert(tblImages, Image)
            Image = nil
            blnFlag = false
            end

            i,j = string.find(v, "/") —- MAC ONLY。 Windows 为反斜杠 *****
            Image.filePath = string.sub(v, i)   —— 返回文件路径
            --Image.name = string.match(v, "([^/]+)$")  —— 返回文件名
            blnFlag = true

        elseif string.find(v, "ISO") ~= nil then
            Image.iso = string.match(v, "%a+:(.+)") —- 获得冒号右侧的文本(即值)
        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  —— 对应于富士 exif 中的“自动动态范围”和“开发动态范围”
            Image.dr = string.match(v, "%a+:(.+)")
        else

        end
    end
end

当然,我可以通过使用嵌套表或类似的东西代替平面 tblOutput 元数据列表来更好地编程,我可能会在某个时候这样做。

点赞
用户1847592
用户1847592
对于 tblMetadata 中的每一行
  -- 创建新的本地空实例
  local objImage = {}
  -- 填充数据
  objImage.name = blahblah
  objImage.iso = blahblah
  等等...
  table.insert(tblImages, objImage)
  -- 不需要将变量 objImage 赋值为 nil 
  -- objImage 在超出作用域时会自动垃圾回收
end
2017-06-17 11:43:53
用户5219197
用户5219197

可能需要使用空表来重置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
2017-06-17 13:32:10