如何获取尚未声明但即将声明的变量?

如何获得尚未声明的变量?

这里是一个简单的例子:

a = b
b = 123

我想从这两行中得到的是 a << 123。但显然它不会工作。

我知道得到答案 a = 123 的简单方法是将第一行剪切并将其粘贴到第二行以下。

但是我有一些问题。我需要像“WillDeclaredVar()”这样的函数,我可以使用它来进行以下操作:

a = WillDeclaredVar(b)
sheepCount = 123
b = sheepCount
print(a)

因此,我可以得到答案“123”。

或者有任何内置函数,会允许我执行类似的操作吗?

===

我认为timrau给出的链接并没有说到我的情况。关键在于如何获得未声明的变量。

===

添加实际代码:

triggerCount = 0 --计算“Trigger”函数的数量
本地触发器=函数(t)
triggerCount =触发器计数+ 1
返回触发器(t)
end

-以下触发器与while语句相同。
-下面的触发器会执行:直到获得64000个MarineCount,将1个MarineCount添加

触发器{ - 这里是触发器函数。现在triggerCount = 1。
players = {P1}
行动 = {
   SetDeaths(P1, Add, 1, "Terran Marine")
},
flag = {维护},
}
Portal(LoopStart);
-函数Portal(VariableName)返回VariableName = triggerCount。所以LoopStart = 1。

触发器{ - 现在triggerCount = 2。
players = {P1}
行动 = {
   LinkList(LoopEnd, LoopStart);
-函数LinkList(From,To)将“From”触发器的下一个指针更改为“To”触发器。
-但现在问题发生了。因为'LoopEnd'尚未声明。
},
flag = {维护},
}

触发器{ --现在triggerCount = 3。
players = {P1}
conditions = {
   Deaths(P1, Exactly, 64000, "Terran Marine");
}
行动 = {
  _LinkList(LoopEnd);
  -如果MarineCount达到64000,则重置LoopEnd的下一个指针(= LoopEscape)
},
flag = {维护},
}
Portal(LoopEnd); -- LoopEnd = 3。

1.更改触发器的顺序将破坏触发器逻辑(while语句)。

2.我要做的就是轻松编码。坦白地说,我不需要解决这个问题(获取未声明的变量)。我可以想象几种方法来避免它。但是,如果我使用这些方法,那么编码工作将非常复杂,并且编码难度将大大增加。编码的难度使我最近几个月停止了编码。

点赞
用户1847592
用户1847592

要将var1指向var2,请写成var1 = ReferenceF or var2(请注意“ReferenceFor”内部有一个空格!)

做
   本地值、引用、引用标记= {},{}
   setmetatable(_G, {
      __index = function (_, name)
         if name == 'ReferenceF' then
            reference_flag = true
         elseif reference_flag then
            reference_flag = false
            return {[references] = name}
         elseif references[name] then
            return _G[references[name]]
         else
            return values[name]
         end
      end,
      __newindex = function (_, name, val)
         if type(val) == 'table' and val[references] then
            references[name] = val[references]
         else
            values[name] = val
         end
      end
   })
end

a = ReferenceF or b  -- a 是 b 的引用
b = ReferenceF or c  -- b 是 c 的引用
sheepCount = 123
c = sheepCount
print(a, b, c)  --> 123 123 123
2015-10-03 16:40:40
用户501459
用户501459

如何获取尚未声明的变量?

除了时空旅行,你做不到。

你的示例代码没有解释问题的动机,因为这样做:

a = WillDeclaredVar(b)
sheepCount = 123
b = sheepCount
print(a)

可以简单地重新排列为:

sheepCount = 123
b = sheepCount
a = WillDeclaredVar(b)
print(a)

如果您展示尝试解决的实际问题(以避免 XY问题),那么回答您的问题就会更容易。

但是,根据所述,有几件事情需要注意。

首先,您需要区分变量的“声明”和“赋值”。在Lua中,您可以说:

local b

b声明为局部变量,这可能会在堆栈帧中为其创建一个槽,并允许您将闭包绑定到其中。

但是,以下行:

a = WillDeclaredVar(b)

将传递WillDeclaredVar b“当前”拥有的值,并且a没有办法因b被分配新值而在回顾性地更改。这永远不会发生。aWillDeclaredVar甚至不知道b存在,它们在调用时会接收它包含的值。

但是,您可以将变量b绑定到一个闭包中,该闭包将在需要时获取b的当前值。

-- 在赋值前声明变量b,也称为“前向引用”
local b
a = function() return b end
sheepCount = 123
b = sheepCount
print(a()) -- 调用a以获取b的当前值

另一种方法是将b作为 全局 变量,这实际上只是您的环境表中的一个键,因此您可以说:

a = WillDeclaredVar('b')

并且当需要时a将成为可以获取__ENV['b']的当前值的某个对象。

但是,这两种方式都不支持这个语法:

print(a)

a需要是一个函数,即在需要时查找b的值而不是仅保存先前计算出的值。在这种特殊情况下(即a需要转换为字符串),您可以创建一个实现了__tostring的代理对象。

function WillDeclaredVar(variableName)
    local proxy = { environment = _ENV or _G, variableName = variableName }
    return setmetatable(proxy, {
        __tostring = function(proxy)
            return proxy.environment[proxy.variableName]
        end
    })
end

-- 在需要时,a将基于b的当前值计算一个值
a = WillDeclaredVar('b')
sheepCount = 123
b = sheepCount
print(a)

输出:

123
2015-10-03 20:46:16