Перемещение по различным параметрам расположения файлов в Lua - PullRequest
2 голосов
/ 18 июня 2019

По сути, я пытаюсь создать функцию, которая проверяет первое заданное мною местоположение в виде:

 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")

Платформа IЯ использую не выдает ошибки, он просто возвращает пустое вместо запуска сценария lua, поэтому я не могу отладить (следовательно, обычно с помощью repl.it).

Я знаю, что это делает это немного абстрактным вопросом, но если кто-нибудь знает, как я могу делать то, что я описываю, это будет очень цениться.

1 Ответ

2 голосов
/ 19 июня 2019

Допущения

Глядя на ваш ответ, я предположу, что

  1. myComputer.referenceLookup определено где-то еще и работает как задумано (а не является частью этого вопроса)
  2. NULL также определено где-то еще и представляет собой некое nil-значение

Ответ

Строка

if myComputer.referenceLookup("/Address/ .. (x) .. /text") != NULL or "None" or "" then

не работаетпотому что оператор or не работает таким образом.

Как Lua интерпретирует его как

if (myComputer.referenceLookup("/Address/ .. (x) .. /text") != NULL) or "None" or ""

, а так как "None" является строковым значением и, таким образом, считается истинным, то еслиусловие всегда будет иметь значение 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

Extra

Если вы хотите упростить расширение вашей программы, вы также можетеиспользуйте 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), если шаблон является строкой.( дальнейшее чтение )

...