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

时间:2019-05-08 17:09:50

标签: lua love2d

全部!

我来这里是因为我有一个问题困扰了我一段时间。我使用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

这样我可以在不更改原始内容的情况下获得所需的输出?还是我的代码有一些我看不到的问题?

谢谢!

2 个答案:

答案 0 :(得分:3)

实际上,这个问题的性质在Love2D和Lua中都是如此。无论如何。

引用Lua Reference Manual 5.3

  

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

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