在Lua脚本中跨函数共享变量

在Lua脚本中跨函数共享变量,lua,Lua,请看下面的Lua脚本 其思想是,在更改状态之前,我通过调用“getStateFlag()”并分配给“status”变量来获取当前状态。方法ChangeState1或ChangeState2可以更改当前状态。所以稍后调用ResetStatus方法时,我可以通过分配存储的“status”值来重置为旧状态 但问题是,这个“status”变量总是设置为0 function Start() status = 0 local flag = getStateFlag() if(flag

请看下面的Lua脚本

其思想是,在更改状态之前,我通过调用“getStateFlag()”并分配给“status”变量来获取当前状态。方法ChangeState1或ChangeState2可以更改当前状态。所以稍后调用ResetStatus方法时,我可以通过分配存储的“status”值来重置为旧状态

但问题是,这个“status”变量总是设置为0

function Start()
    status = 0
    local flag = getStateFlag()
    if(flag == 1) then
       status = getCurrentStatus()
       ChangeState1()
    else if(flag == 2) then
       status = getCurrentStatus()
       ChangeState2()
    else
       ResetStatus(status) 
    end
end

function ChangeStatus1()
     device::set_value(1)
end

function ChangeStatus1()
     device::set_value(2)
end

function ResetStatus(status)
     device::set_value(status)
end
但问题是,此“状态”变量始终设置为0。


首先,您应该分离两个不同的值—以前保存的状态和使用getCurrentStatus()获得的当前状态。现在,您将它们混合在一个变量中,每次输入Start()函数时,该变量都会被初始化为0。当您不询问当前状态(即标志不是1或2)时,您实际上使用
status=0
赋值销毁了以前保存的值。

因此,如果我正确理解了您的问题,您将多次调用
Start()
。 如果
flag
等于1或2,您希望存储当前状态值,然后它将在
ChangeState1()或
ChangeState2()中更改
否则,您希望将
状态
重置为上次调用
Start()
但当前,每次调用
Start()
时,如果
标志不为1或2,则它将为0

因此,基本上,您只希望在尚未定义状态时使用0初始化状态

在Start()中可以执行以下操作:

因此,如果
status
为nil,它将默认为0,否则它将保持不变

或者您只需在函数外部初始化状态

更干净的解决方案是将备份状态与由ChangeState1或ChangeState2更改的值分开。
因此,只有在需要备份或恢复时,才能访问backupStatus变量。否则,您将使用一些currentStatus变量。

根据Pieget回答中的注释,这里的问题似乎是运行时环境在每次运行之间删除或清除全局变量。您可以通过在Start()开头打印status的值来验证这一点(假设您有某种方法获得输出)。如果它总是零,这是一个相当好的指标,你每次都在失去全局状态


如果在您的环境中是这种情况,您必须找到另一种方法来跨运行存储状态。您可以访问特定于平台的文件系统或某些外部存储。

单击按钮即可运行此脚本。所以,每次这个脚本运行时,它都会分配status=0,正如我这样声明的。是否有其他方法保持此值不变?每次单击按钮时,此完整脚本都将运行。因此,如果状态有值,则在下次执行时不应将其分配给0。。。有什么办法吗?@Roe是的,照我说的做。我试过status=status或0。。。但是status的值始终为0。我认为每次运行此脚本时,status的值都在初始化。是否删除了status=0的行?当然,当您的全局作用域丢失时,status的值也将丢失。是的,我删除了status=0,现在我的status=status或0。那么,当同一个脚本再次运行时,是否有一种方法来保持变量的值?请考虑编辑您的问题来描述您正在运行的环境(它听起来像某种嵌入式处理器?)。如果其他用户对此有经验,他们可能会有想法。
status = status or 0