全部!
我来这里是因为我有一个问题困扰了我一段时间。我使用love2d引擎作为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
这样我可以在不更改原始内容的情况下获得所需的输出?还是我的代码有一些我看不到的问题?
谢谢!
答案 0 :(得分:3)
实际上,这个问题的性质在Love2D和Lua中都是如此。无论如何。
表,函数,线程和(完整)用户数据值是对象:变量实际上并不包含这些值,而只是对其的引用。赋值,参数传递和函数返回总是操纵对此类值的引用;这些操作并不意味着任何形式的复制。
Love2D中的大多数类型都是userdata Lua类型的,因此,在将它们传递给函数时,实际上是在传递对它们的引用,因此最终要修改“旧”版本。这些类型通常具有复制它们的功能。
ImageData
确实有一个,而Image
没有,但是您可以执行以下操作:
userdata
请注意,我基于复制的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
和旧标记中的图像标记创建了全新的Image
。
答案 1 :(得分:2)
在Lua中,当您使变量等于表值时,您不是在复制或复制该信息。新变量仅指向与另一个变量相同的值。
示例:
import random
import string
password_to_be_generated = ""
Length = int(input("how many characters would you like in you password"))
while len(password_to_be_generated) != Length:
Num1 = random.choice(string.ascii_uppercase)
Num2 = random.choice(string.ascii_lowercase)
Num3 = random.choice(string.digits)
Everything = [Num1, Num2, Num3]
password_to_be_generated += random.choice(Everything)
print(password_to_be_generated)
要基于tbl1 = {}
tbl2 = tbl1
tbl2[1] = 1
print(tbl1[1])
创建一个newImgData
,您需要进行深拷贝:
oldImgData
用于表复制的资源:Lua-Users Wiki: Copy Table
此解决方案仅适用于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