lua -> 如何将这些参数修改为const,或者我该怎么做?

全部!

我来这里是因为有一个问题困扰着我已经很长时间了。我正在使用love2d引擎作为lua脚本的“图形”补充,但这个问题是lua类型的(我相信至少是这样的)。

我有一个函数:

createNew_keepOld = function (oldImgData, oldImgDraw)
    local newImgData = oldImgData --我正在将旧值分配给另一个变量
    local newImgDraw = oldImgDraw --我正在做与数据一样的事情

    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)

    返回某些事情
end

这样我就可以得到我需要的输出而不改变原始的东西吗?或者我的代码是否存在某些我看不见的问题?

谢谢!

点赞
用户7396148
用户7396148

Lua 变量与表格

在 Lua 中,如果你让一个变量等于某个表格值,你并没有复制或者复制该信息,新变量只是简单地指向另一个变量相同的值。

举个例子:

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

关于表格复制的资源: Lua-Users Wiki: Copy Table

这种解决方案仅适用于 table 类型,对于 userdata 则不适用。

2019-05-08 17:56:23
用户4567755
用户4567755

实际上,这个问题的本质是Love2D和Lua两者之间的。无论如何。

引用自Lua参考手册5.3:

表、函数、线程和(完整的)用户数据值都是对象:变量实际上不包含这些值,而只包含对这些值的引用。 赋值、参数传递和函数返回总是操作对这些值的引用;这些操作不意味着任何类型的复制。

Love2D中的大多数类型都是userdata Lua类型,因此当将它们传递给您的函数时,您实际上是传递对它们的引用,因此您最终修改的是“旧”版本。这些类型通常都有用于复制它们的功能。

ImageData确实有一个,而 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

2019-05-08 17:56:32