lua -> 如何将这些参数修改为const,或者我应该怎么做?
lua -> how to modify these arguments to be const, or what should I do?
所有!
我来这里是因为有一个问题困扰了我一段时间。我正在使用 love2d 引擎作为 'graphical' 添加到 lua 脚本,但这个问题属于 lua 类型(我相信,至少)。
我有一个功能:
createNew_keepOld = function (oldImgData, oldImgDraw)
local newImgData = oldImgData --I am assigning old value to another variable
local newImgDraw = oldImgDraw --I am doing the same thing as with data
for x = 0, newImgData:getWidth()-1 do
for y = 0, newImgData:getHeight()-1 do
local r, g, b, a = newImgData:getPixel(x, y)
r = 2*r
g = 2*g
b = 0.5*b
a = 2*a
newImgData:setPixel(x, y, r, g, b, a)
end
end
newImgDraw:replacePixels(newImgData)
return newImgData, newImgDraw
end
此代码完成后,我得到了我需要的更改,但不是我想要的。我只想生成两个新变量来存储数据和图像对象。但是,在此过程中,原始图像发生了变化。
有没有办法申报:
name = function (const param, const param)
return some_things
end
以便在不更改原始内容的情况下获得所需的输出?还是我的代码有一些我看不到的问题?
谢谢!
在 Lua 中,当您使变量等于 table 值时,您并不是在复制或复制该信息。新变量只是指向与另一个变量相同的值。
示例:
tbl1 = {}
tbl2 = tbl1
tbl2[1] = 1
print(tbl1[1])
为了创建基于 oldImgData
的 newImgData
,您需要执行深层复制:
function deepcopy(orig)
local orig_type = type(orig)
local copy
if orig_type == 'table' then
copy = {}
for orig_key, orig_value in next, orig, nil do
copy[deepcopy(orig_key)] = deepcopy(orig_value)
end
setmetatable(copy, deepcopy(getmetatable(orig)))
else -- number, string, boolean, etc
copy = orig
end
return copy
end
用于 table 复制的资源:Lua-Users Wiki: Copy Table
此解决方案仅适用于 table
类型,不适用于 userdata
其实这个问题的本质是Love2D和Lua。不管怎样
Tables, functions, threads, and (full) userdata values are objects: variables do not actually contain these values, only references to them. Assignment, parameter passing, and function returns always manipulate references to such values; these operations do not imply any kind of copy.
Love2D 中的大多数类型都是用户数据 Lua 类型,因此当将它们传递给您的函数时,您实际上是在传递对它们的引用,因此您在最后修改了 "old" 版本。这些类型通常具有用于复制它们的函数。
ImageData
does have one and Image
不会,但您可以执行以下操作:
createNew_keepOld = function (oldImgData, oldImgDraw)
local newImgData = oldImgData:clone()
for x = 0, newImgData:getWidth()-1 do
for y = 0, newImgData:getHeight()-1 do
local r, g, b, a = newImgData:getPixel(x, y)
r = 2*r
g = 2*g
b = 0.5*b
a = 2*a
newImgData:setPixel(x, y, r, g, b, a)
end
end
local newImgDraw = love.graphics.newImage(newImgData, oldImgDraw:getFlags())
return newImgData, newImgDraw
end
请注意,我根据复制的 ImageData
和旧标记的图像标记创建了全新的 Image
。
所有!
我来这里是因为有一个问题困扰了我一段时间。我正在使用 love2d 引擎作为 'graphical' 添加到 lua 脚本,但这个问题属于 lua 类型(我相信,至少)。
我有一个功能:
createNew_keepOld = function (oldImgData, oldImgDraw)
local newImgData = oldImgData --I am assigning old value to another variable
local newImgDraw = oldImgDraw --I am doing the same thing as with data
for x = 0, newImgData:getWidth()-1 do
for y = 0, newImgData:getHeight()-1 do
local r, g, b, a = newImgData:getPixel(x, y)
r = 2*r
g = 2*g
b = 0.5*b
a = 2*a
newImgData:setPixel(x, y, r, g, b, a)
end
end
newImgDraw:replacePixels(newImgData)
return newImgData, newImgDraw
end
此代码完成后,我得到了我需要的更改,但不是我想要的。我只想生成两个新变量来存储数据和图像对象。但是,在此过程中,原始图像发生了变化。
有没有办法申报:
name = function (const param, const param)
return some_things
end
以便在不更改原始内容的情况下获得所需的输出?还是我的代码有一些我看不到的问题?
谢谢!
在 Lua 中,当您使变量等于 table 值时,您并不是在复制或复制该信息。新变量只是指向与另一个变量相同的值。
示例:
tbl1 = {}
tbl2 = tbl1
tbl2[1] = 1
print(tbl1[1])
为了创建基于 oldImgData
的 newImgData
,您需要执行深层复制:
function deepcopy(orig)
local orig_type = type(orig)
local copy
if orig_type == 'table' then
copy = {}
for orig_key, orig_value in next, orig, nil do
copy[deepcopy(orig_key)] = deepcopy(orig_value)
end
setmetatable(copy, deepcopy(getmetatable(orig)))
else -- number, string, boolean, etc
copy = orig
end
return copy
end
用于 table 复制的资源:Lua-Users Wiki: Copy Table
此解决方案仅适用于 table
类型,不适用于 userdata
其实这个问题的本质是Love2D和Lua。不管怎样
Tables, functions, threads, and (full) userdata values are objects: variables do not actually contain these values, only references to them. Assignment, parameter passing, and function returns always manipulate references to such values; these operations do not imply any kind of copy.
Love2D 中的大多数类型都是用户数据 Lua 类型,因此当将它们传递给您的函数时,您实际上是在传递对它们的引用,因此您在最后修改了 "old" 版本。这些类型通常具有用于复制它们的函数。
ImageData
does have one and Image
不会,但您可以执行以下操作:
createNew_keepOld = function (oldImgData, oldImgDraw)
local newImgData = oldImgData:clone()
for x = 0, newImgData:getWidth()-1 do
for y = 0, newImgData:getHeight()-1 do
local r, g, b, a = newImgData:getPixel(x, y)
r = 2*r
g = 2*g
b = 0.5*b
a = 2*a
newImgData:setPixel(x, y, r, g, b, a)
end
end
local newImgDraw = love.graphics.newImage(newImgData, oldImgDraw:getFlags())
return newImgData, newImgDraw
end
请注意,我根据复制的 ImageData
和旧标记的图像标记创建了全新的 Image
。