Если честно, ваш код мало что значит, и, возможно, потому, что вы не используете все то хорошее, что может предложить Lua.
{404.08, -920.23, 'sinnerstreet', 'Sinner Street'},
Там вы храните избыточные данные.Третье значение на самом деле просто четвертое с удаленными пробелами и строчными буквами.
'sinnerstreet' == ('Sinner Street'):gsub("[^%l]", ""):lower()
На английском языке: принять "Sinner Street", g lobally (имеется в виду во всей строке) sub Укажите все, что не является строчной (%l
) буквой, и ничего (""
), а затем создайте результат из этой строчной буквы.То, что вы получаете, - это «sinnerstreet».
x, y, streetname, displayname = table.unpack(v)
Использование глобалов там не очень хорошо.Глобалы - это дьявол.Не используйте их.
Затем, несколько строчек ниже:
SetNewWaypoint(x, y)
Подумайте об этом на мгновение.Вы устанавливаете x
и y
в каждой итерации цикла for.После завершения цикла они всегда содержат координаты последней путевой точки, по которой вы итерировали.Я сомневаюсь, что это то, что вы хотите.Используйте local
;это заставляет вас думать, какой должна быть область действия ваших переменных, что поможет вам определить проблему такого рода.
elseif args[2] ~= nil and args[3] == nil then
results = args[1] .. args[2]
Если вы специально не хотите ограничить ее тремя аргументами, в чем я сомневаюсь,Вы также можете использовать table.concat
для объединения всех значений в последовательности (читай: массив)
results = string.lower( table.concat(args) )
Меня удивляет то, что вы делаете это в цикле.Для каждой путевой точки вы устанавливаете result
в одно и то же значение, которое объединяет все аргументы и преобразует их в нижний регистр.
что теперь?Вы проверяете, содержит ли result
(то, что искал пользователь) streetname
, который, как мы уже выяснили, содержит имя последней путевой точки в списке.
Использование таблиц для поиска
У Lua есть таблицы, одна из, если не самая мощная, структура данных общего назначения в программировании.
local map = {}
for _,waypoint in ipairs(waypoints) do
map[waypoint[3]:lower()] = waypoint
end
Это даст вам примерно следующее:
local map = {
sinnerstreet = {404.08, -920.23, 'sinnerstreet', 'Sinner Street'},
atleestreet = {360.85, -956.46, 'atleestreet', 'Atlee Street'},
littlebighornavenue ={500.48, -956.80, 'littlebighornavenue', 'Little Bighorn Avenue'},
}
и если вы хотите узнать, существует ли улица, вы можете просто сделать следующее:
if map['atleestreet'] then
print(map.atleestreet[4])
end
if
рассматривает все, что не является false
или nil
как правдивое,так что вы можете просто написать `map ['atleestreet'] в условии my_table['text']
можно записать как my_table.text
- Поиск строковых индексов в таблице довольно быстро из-за того, какэто реализовано.
Заключение
Попробуйте продумать свой код до конца.Если необходимо, пролистайте его построчно, записав, какие значения переменные содержат в каждый момент.Если вы занимались этим некоторое время, сначала немного отдохните или какое-то время займитесь чем-нибудь другим.
Затем установите переменные на local
, где это возможно (читай: везде), выясните, что нужнобыть внутри и снаружи цикла и попытаться снова.
Замечания
Вместо if something == nil
вы можете просто написать if not something
, а if something ~= nil
просто if something
Извинения
Извините за длинную стену текста и использование пробелов в скобках, но я хотел, чтобы все было особенно легко понять.