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])

为了创建基于 oldImgDatanewImgData,您需要执行深层复制:

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。不管怎样

引自Lua Reference Manual 5.3

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