【问题标题】:Changing variable in a table更改表中的变量
【发布时间】:2016-08-10 21:55:09
【问题描述】:

我怎样才能使变化的变量成为表格的元素,就像这样。

local table = {}
local var = 10

现在我想将此变量作为table 的元素插入。 像这样的:

table[1] = var

我需要的是,每当我调用这个table[1],即使变量发生变化,它也会调用那个变量的实际值,像这样:

print(table[1]) -> prints 10
var = var + 5
print(table[1]) -> prints 15

这有可能吗?

编辑: 我想要完成的是:我想在表格中有一个元素,说明应该显示哪个变量。例如:

local var1 = 10
local var2 = 20

现在,如果我有一个表格,其中的元素是这些变量的字符串,如下所示:

local table = {"var1", "var2"}

现在如果我执行print(table[1]),它当然会打印出“var1”,但是当我实际需要该变量时,有什么办法可以将string 的表元素转换为对变量的调用.您可能会问我为什么不直接打电话给var1,但我可以解释一个原因,但它会很长。假设我只需要这种方式。此外,var1/var2 可以更改

【问题讨论】:

    标签: lua coronasdk


    【解决方案1】:

    你有几个选择。

    1) Field 函数作为 var 的闭包:简单但需要更改使用方式

    local t = {}
    local var = 10
    t.varf = function() return var end -- varf could be named var but that might be confusing
    
    var = var + 5
    print(t.varf()) -- call it to get the value
    

    2) __index 元方法避免显式函数调用语法

    local t = {}
    local var = 10
    setmetatable(t, { 
        __index = function(_, k) 
            if k=="var" then return var else return nil 
        end})
    
    var = var + 5
    print(t.var) -- t does not contain a field with key "var" so __index is called 
    

    (__index 函数也是对 var 的闭包。) 如果你想通过 t 修改 var,那么请查看 __newindex 元方法。

    这两种方法都使用闭包。闭包是一个函数,它在其参数和主体之外引用非全局变量。

    【讨论】:

    • 我真的很喜欢 1) 解决方案。谢谢。
    【解决方案2】:

    Lua 中的数字在分配时由 copy 共享。 table[1]var 都收到自己的独立号码10 的副本。

    如果要共享数字,则需要将它们封装在自己的表中。

    local table = {}
    local var = { value = 10 }
    
    table[1] = var
    
    print(table[1].value) -- prints 10
    var.value = var.value + 5
    print(table[1].value) -- prints 15
    

    您还可以考虑对数字创建某种抽象。一个简单的例子。不过,您需要确保您的操作定义明确。

    local number = {}
    number.__index = number
    
    local function Number (value)
        return setmetatable({ value = value }, number)
    end
    
    function number.__add (a, b)
        if type(b) == 'number' then
            return Number(a.value + b)
        elseif getmetatable(b) == number then
            return Number(a.value + b.value)
        end
    
        error("one of `number, Number' expected")
    end
    
    function number:add (n)
        if type(n) == 'number' then
            self.value = self.value + n
        elseif getmetatable(n) == number then
            self.value = self.value + n.value
        else
            error("one of `number, Number' expected")
        end
    
        return self.value
    end
    
    function number.__tostring (v)
        return v.value .. ''
    end
    
    
    
    local foo = {}
    local bar = Number(10)
    foo[1] = bar
    
    print(foo[1]) -- 10
    bar:add(5)
    print(foo[1]) -- 15
    print(bar + 25) -- 40
    

    【讨论】:

    • 即使这有帮助,我还想问点别的。我可以这样做: local var = 10 local table = {"var"} 现在,我可以以某种方式将这个字符串转换为调用实际变量,还是不可能?
    • @FICHEKK 如果我们能准确地知道您要做什么,那就太好了,因为您可能以错误的方式解决问题。可以通过debug操作获取局部值,但是很不优雅。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多