我实质上是在尝试创建一个函数来测试我给出的第一个位置,格式为:
myComputer.referenceLookup("/address/x/text")
,如果该字符串不是NULL或“ None”或“”(空),则返回该位置的字符串。
如果没有,我希望它测试下一个可能的位置:
myComputer.referenceLookup("/address/1/x/text")
否则,我希望它返回一个空字符串(“”)。
我尝试搜索Lua Manual并没有用到在repl.it中测试不同的形式,但是不幸的是,我无法像在测试中那样重复一个通常的例子。
function firstLine(x)
if myComputer.referenceLookup("/Address/ .. (x) .. /text") != NULL or "None" or "" then
return myComputer.referenceLookup("/Address/ .. (x) .. /text")
elseif myComputer.referenceLookup("/Address/1/ .. (x) .. /text") != NULL or "None" or "" then
return myComputer.referenceLookup("/Address/1/ .. (x) .. /text")
else
return ""
end
end
myComputer.out.firstHouseNumber = firstLine(housenumber)
值得注意的是,我通常会引用以下事实:
myComputer.out.firstHouseNumber= myComputer.referenceLookup("/Address/housenumber/text")
或
myComputer.out.firstHouseNumber= myComputer.referenceLookup("/Address/1/housenumber/text")
我正在使用的平台不会引发错误,它只会返回空白而不是运行lua脚本,因此我无法调试(因此通常使用repl.it)。
我知道这使它成为一个抽象的问题,但是如果有人知道我能做我正在描述的事情,将不胜感激。
答案 0 :(得分:2)
看看你的回答,我会认为
myComputer.referenceLookup
是在其他地方定义的,并且按预期方式工作(并非该问题的一部分)NULL
也定义在其他地方,代表某种零值行
if myComputer.referenceLookup("/Address/ .. (x) .. /text") != NULL or "None" or "" then
不起作用,因为or
运算符不起作用。
Lua的解释是
if (myComputer.referenceLookup("/Address/ .. (x) .. /text") != NULL) or "None" or ""
,由于“ None”是一个字符串值,因此被认为是真实的,因此if条件将始终为true,因此它将始终返回第一个位置。另外,Lua中没有!=
运算符;而是~=
。
对于解决方案,基本上需要这样的三个比较:
if myComputer.referenceLookup("/Address/" .. x .. "/text") ~= NULL
and myComputer.referenceLookup("/Address/" .. x .. "/text") ~= "None"
and myComputer.referenceLookup("/Address/" .. x .. "/text") ~= "" then
显然,三次调用该函数不是一个好主意,这既出于性能方面的考虑,也可能具有副作用,因此最好先将其保存到变量中,如下所示:
local result = myComputer.referenceLookup("/Address/" .. (x) .. "/text")
if result ~= NULL and result ~= "None" and result ~= "" then
return result
end
如果要使程序易于扩展,也可以使用string.format
从模板构建位置。假设您有一个包含所有位置的表格,如下所示:
local locations = {
"/Address/%s/text";
"/Address/1/%s/text";
}
然后,您可以使用ipairs
遍历条目,并使用string.format
构建每个位置:
for index, template in ipairs(locations) do
local result = myComputer.referenceLookup(template:format(x))
if result ~= NULL and result ~= "None" and result ~= "" then
return result
end
end
请注意,只要模板是字符串,就可以将string.format(template, x)
写为template:format(x)
。 (further reading)