我如何做等同于在 Lua 中按值传递参数?
How do I do the equivalent to passing parameters by value in Lua?
我是 Lua 的新手,我刚刚尝试做一些在其他语言中常见且简单的事情,但由于参数的原因,在 Lua 中的工作方式不同通过引用传递的函数(我假设)。此外,向 tables 添加内容似乎也是通过引用完成的。伪代码:
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
(或同等语言)会重置对象以允许将新图像添加到 table。但是在 Lua 中它将刚刚添加到 table 中的对象设置为 nil。像这样以迭代方式将一系列 'objects' 添加到 table 的技术是什么?我尝试使用第二个 objImage (objImage2) 并在将它 (objImage2) 添加到 table 之前将 objImage 分配给它,但这只是将 pointer/reference 分配给原始 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
我当然可以通过使用嵌套的 table 或类似的东西而不是平坦的 tblOutput 元数据列表来更好地编程,我可能会在某个时候这样做。
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
可能您必须使用空 table 而不是 nil
值来重置 objImage
。
例如:
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
我是 Lua 的新手,我刚刚尝试做一些在其他语言中常见且简单的事情,但由于参数的原因,在 Lua 中的工作方式不同通过引用传递的函数(我假设)。此外,向 tables 添加内容似乎也是通过引用完成的。伪代码:
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
(或同等语言)会重置对象以允许将新图像添加到 table。但是在 Lua 中它将刚刚添加到 table 中的对象设置为 nil。像这样以迭代方式将一系列 'objects' 添加到 table 的技术是什么?我尝试使用第二个 objImage (objImage2) 并在将它 (objImage2) 添加到 table 之前将 objImage 分配给它,但这只是将 pointer/reference 分配给原始 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
我当然可以通过使用嵌套的 table 或类似的东西而不是平坦的 tblOutput 元数据列表来更好地编程,我可能会在某个时候这样做。
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
可能您必须使用空 table 而不是 nil
值来重置 objImage
。
例如:
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