循环浏览不同的文件位置选项
Cycling through different file location options
我实际上是在尝试创建一个函数来测试我给出的第一个位置,形式为:
myComputer.referenceLookup("/address/x/text")
和 return 该位置的字符串,如果它不是 NULL 或 "None" 或 ""(空)。
如果没有,我希望它测试下一个可能的位置:
myComputer.referenceLookup("/address/1/x/text")
否则,我想return一个空字符串("")。
我尝试查看 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")
我使用的平台不会抛出错误,它只会 return 空白而不是 运行 lua 脚本,所以我无法调试(因此通常使用repl.it)。
我知道这使它成为一个有点抽象的问题,但如果有人知道我如何做我所描述的,将不胜感激。
假设
看了你的回答,我会假设
myComputer.referenceLookup
在其他地方定义并按预期工作(而不是这个问题的一部分)
NULL
也在别处定义并代表某种 nil-value
回答
行
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 条件将始终评估为真,因此它将始终 return 第一个位置。此外,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
从模板构建位置。假设您有一个包含所有位置的 table,如下所示:
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)
。 ()
我实际上是在尝试创建一个函数来测试我给出的第一个位置,形式为:
myComputer.referenceLookup("/address/x/text")
和 return 该位置的字符串,如果它不是 NULL 或 "None" 或 ""(空)。
如果没有,我希望它测试下一个可能的位置:
myComputer.referenceLookup("/address/1/x/text")
否则,我想return一个空字符串("")。
我尝试查看 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")
我使用的平台不会抛出错误,它只会 return 空白而不是 运行 lua 脚本,所以我无法调试(因此通常使用repl.it)。
我知道这使它成为一个有点抽象的问题,但如果有人知道我如何做我所描述的,将不胜感激。
假设
看了你的回答,我会假设
myComputer.referenceLookup
在其他地方定义并按预期工作(而不是这个问题的一部分)NULL
也在别处定义并代表某种 nil-value
回答
行
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 条件将始终评估为真,因此它将始终 return 第一个位置。此外,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
从模板构建位置。假设您有一个包含所有位置的 table,如下所示:
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)
。 (