【问题标题】:Lua - Defining Global Tables within a FunctionLua - 在函数中定义全局表
【发布时间】:2014-03-12 18:59:00
【问题描述】:

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

下面的代码一切正常,但我很困惑我无法在conky_top_control() 的功能块中定义全局表t1t2t3t4。我不得不在块外创建它们,但为了美观,我想将表创建保留在功能代码块内。我已经尝试在表格前面没有“本地”定义的情况下列出它们。我也找不到正确的语法来使用环境声明 _G 来创建表,如果这甚至是正确的用法。

所以,问题是:如何将函数内的表定义为全局表?特别是与下面定义的表t1t2t3t4 相关?

这是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

【问题讨论】:

  • 所有 Lua 代码都被编译为一个函数,因此所有全局变量都设置在“函数内”......这只是为了让您知道您是否遇到了错误的问题你的问题。

标签: lua


【解决方案1】:

实际上,您不需要全局变量。一般来说,它们是一种糟糕的做法,会导致您的代码和其他代码中出现严重错误。

试试这个方法:

local t1,t2,t3,t4={},{},{},{} -- state variables for conky_top_control
function conky_top_control()
    -- use t1,t2,t3,t4
end

由于局部变量 t1,t2,t3,t4 在定义 conky_top_control 的范围内,因此它们被捕获为引用。它们的值将在对 conky_top_control 的调用中保持不变,它可以读取和修改它们。

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

【讨论】:

    【解决方案2】:

    您可以将全局变量初始化移动到函数中,只需添加一个检查全局变量是否先前已初始化的条件。

    function conky_top_control()
        if not t1 then
            t1,t2,t3,t4={},{},{},{}
        end
        -- rest of function
    end
    

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

    【讨论】:

      【解决方案3】:

      我很困惑我不能在conky_top_control()的函数块中定义全局表t1、t2、t3和t4

      没有办法/不需要定义global variables。当您将分配移至函数时,事情将停止工作,因为您的变量会在每次调用该函数时重新分配。

      我也找不到正确的语法来使用环境声明 _G 来创建表,如果这是正确的用法的话。

      您可以使用_G.t1 语法从(全局)环境中引用t1 表。有关详细信息,请参阅此reference

      【讨论】:

        【解决方案4】:

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

        如果在函数中定义全局变量时出错,那么可能是 Conky 设置了一些限制。

        【讨论】:

        • 这不是错误,而是不需要的结果。如果我将 t1,t2,t3,t4={},{},{},{} 移动到功能块中,代码将运行,但我只获得计时器计数“1”的“更新”刷新值。在计时器计数“2”和“3”上,表变量结果为空,这表明它们没有被保留用于这些间隔计数。我是否假设在函数内不正确地使用表的全局声明(即在表声明之前不使用“本地”)?正如我所说,如果表创建留在块之外,则代码可以正常工作。在我看来,无论哪种方式都应该有效。
        猜你喜欢
        • 2012-08-08
        • 1970-01-01
        • 2014-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-22
        • 2018-06-20
        • 1970-01-01
        相关资源
        最近更新 更多