Lua - 函数内定义全局表

我在 Lua 中编写了一个函数,用于为 Conky 提供一个顶部进程列表,以在刷新前延迟 3 秒(间隔)。这需要捕获刷新数据以在下一个刷新之前存储和显示。

代码下面的所有工作都很好,但我对于无法在“conky_top_control()”函数块中定义全局表“t1”,“t2”,“t3”和“t4”感到困惑。我不得不在块外创建它们,但为了外观的缘故,我希望保留表创建在函数代码块内部。我尝试在表前面没有“local”定义的列表中列出它们。如果可能的话,我也找不到使用环境声明“_G”来创建表的正确语法。

因此,问题是:如何在函数内定义表为全局表?具体涉及下面定义的表t1、t2、t3和t4?

以下是 Lua 代码,在 Conky ${lua top_control) 中调用它:

function conky_timer(interval)
    return tonumber(conky_parse("${updates}") % interval+1)
end

t1,t2,t3,t4={},{},{},{}
function conky_top_control()
    if conky_timer(3)==1 then
        for i=1,5 do
        t1[i]=conky_parse('${top name '..i..'}')
        t2[i]=conky_parse('${top pid '..i..'}')
        t3[i]=conky_parse('${top cpu '..i..'}')
        t4[i]=conky_parse('${top mem '..i..'}')
        end
    end
    return conky_parse(t1[1]..'${goto 129}'..t2[1]..'${goto 174}'..t3[1]..'${goto  219}'..t4[1]..'\n'..t1[2]..'${goto 129}'..t2[2]..'${goto 174}'..t3[2]..'${goto 219}'..t4[2]..'\n'..t1[3]..'${goto 129}'..t2[3]..'${goto 174}'..t3[3]..'${goto 219}'..t4[3]..'\n'..t1[4]..'${goto 129}'..t2[4]..'${goto 174}'..t3[4]..'${goto 219}'..t4[4]..'\n'..t1[5]..'${goto 129}'..t2[5]..'${goto 174}'..t3[5]..'${goto 219}'..t4[5])
end
点赞
用户107090
用户107090

在 Lua 中,除非声明为本地变量,否则每个变量都是全局的。

如果您在函数内定义全局变量时发生错误,则可能是 Conky 设置了一些限制。

2014-03-12 21:44:25
用户173806
用户173806

你可以通过添加一个条件来检查全局变量是否已经初始化,将全局变量的初始化移动到函数中。

function conky_top_control()
    if not t1 then
        t1,t2,t3,t4={},{},{},{}
    end
    -- 函数的其余部分
end

这样全局变量只会在第一次调用函数时被设置为空表。

2014-03-12 23:17:00
用户1442917
用户1442917

我很困惑,无法在conky_top_control()函数块内定义全局表t1、t2、t3和t4。

没有必要定义全局变量。当您将分配移动到函数中时,事情就会停止工作,因为您的变量在每次调用该函数时都会被重新分配。

如果可以的话,您可以使用_G.t1语法来引用(全局)环境中的t1表。有关详细信息,请参见参考文献

2014-03-12 23:36:30
用户2226988
用户2226988

实际上,您不需要全局变量。一般来说,全局变量是一种糟糕的实践,会在您的代码和其他代码中产生难以处理的错误。

尝试如下方法:

local t1,t2,t3,t4={},{},{},{} -- conky_top_control 的状态变量
function conky_top_control()
    -- 使用 t1,t2,t3,t4
end

由于 local 变量 t1、t2、t3、t4 在定义 conky_top_control 的作用域中,它们被捕获为引用。它们的值将在对 conky_top_control 的调用间保持持续,并且可以被读取和修改。

现在,外观考虑让位于令人满意的设计。

2014-03-13 03:58:58