【问题标题】:Multiple Messages & Issues Searching Lua Tables搜索 Lua 表的多个消息和问题
【发布时间】:2019-03-01 06:10:30
【问题描述】:

我正在尝试为我所在的在线社区制作 Lua 脚本,当我尝试搜索我相信的表数组时遇到问题。它没有检测到我想要的结果。

它的工作方式是,当有人键入/gps [streetname] 时,它会搜索顶部的表格,检测匹配的街道名称和坐标,然后将航点设置到该相关位置。

目前它在表中只有一个条目时有效,但是当我输入更多时,它将为任何不匹配的街道提供错误消息,然后为匹配的街道提供路点设置消息。我在 Google 上搜索过,但似乎找不到任何帮助。

任何帮助将不胜感激。

waypoint = {
  {404.08, -920.23, 'sinnerstreet', 'Sinner Street'},
  {360.85, -956.46, 'atleestreet', 'Atlee Street'},
  {500.48, -956.80, 'littlebighornavenue', 'Little Bighorn Avenue'},
}

RegisterCommand('gps', function(source, args, rawCommand)
  for k,v in pairs(waypoint) do
    x, y, streetname, displayname = table.unpack(v)
    results = ""

    if args[1] == nil then
      if IsWaypointActive() then
        SetWaypointOff()
        TriggerEvent('chatMessage', '^1^*GPS Navigation: ^r^7Your GPS system has been reset.')
      return end
    elseif args[2] == nil and args[3] == nil then
      results = args[1]
    elseif args[2] ~= nil and args[3] == nil then
      results = args[1] .. args[2]
    else
      results = args[1] .. args[2] .. args[3]
    end

    results = string.lower(results) -- This convertes the args into lower case
  end

  -- This locates the streetname and sets a waypoint to it for the player
  if string.find(streetname, results) then
    SetNewWaypoint(x, y)
    TriggerEvent('chatMessage', '^1^*GPS Navigation: ^r^7Your waypoint to ^1' .. displayname .. '^r^7 has been set.')
  else
    TriggerEvent('chatMessage', '^1^*GPS Navigation: ^r^7There has been an error with your street name, please try again.')
  end
end)

TriggerEvent('chat:addSuggestion', '/gps', 'This creates a waypoint to your designated street. ^*USE: /gps [streetname]')

【问题讨论】:

  • 首先,你好像没有使用rawCommand参数,所以你还不如去掉。如果调用一个函数时使用的参数超过了它的需要,Lua 不会抱怨,它只是丢弃多余的参数,并且通常认为具有不使用的参数/变量是不好的风格,因为它只会让人们感到困惑。如果要显示函数获取了一个它不使用的参数,通常在参数名称前添加_
  • for 循环相同;如果只需要值,一般写for _,v in ...
  • 你知道我如何得到想要的效果吗?我已经按照您的建议进行了更改,但我仍然无法让命令正常工作?
  • 我什至不完全理解你想要什么,但我可以告诉你你的代码做了什么(见我的回答),至少这看起来不像你想要的。可悲的是,您可能不得不几乎从头开始再试一次。
  • 我基本上希望表格存储街道名称的坐标,然后当玩家输入 /GPS [streetname] 时,它将从表格​​中提取街道名称和坐标,并为他们设置新路点在他们的地图上。

标签: lua


【解决方案1】:

说实话,你的代码几乎没有意义,这可能是因为你没有使用 Lua 提供的所有好东西。

{404.08, -920.23, 'sinnerstreet', 'Sinner Street'},

您正在那里存储冗余数据。第三个值实际上只是第四个值,去掉了空格并全部小写。

'sinnerstreet' == ('Sinner Street'):gsub("[^%l]", ""):lower()

英文:取“Sinner Street”,globally(在整个字符串中的意思)sub将所有不是小写 (%l) 的字母替换为什么都没有(""),然后将结果设为小写。你得到的是“sinnerstreet”。

x, y, streetname, displayname = table.unpack(v)

在那里使用全局变量,这是不好的。全球人是魔鬼。不要使用它们。

然后,再往下几行:

SetNewWaypoint(x, y)

想一想。在 for 循环的每次迭代中设置 xy。循环完成后,它们始终包含您迭代的最后一个航点的坐标。我怀疑这就是你想要的。使用local;它迫使您思考您希望变量的范围是什么,这将帮助您发现此类问题。

elseif args[2] ~= nil and args[3] == nil then
  results = args[1] .. args[2]

除非您特别想将其限制为 3 个参数,我对此表示怀疑,您也可以使用 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
  1. if 将所有不是 falsenil 的东西都视为真实,所以你可以在条件中写 `map['atleestreet']
  2. my_table['text'] 可以写成my_table.text
  3. 由于其实现方式,在表中查找字符串索引非常快。

结论

尝试仔细考虑您的代码。如有必要,逐行浏览,写下变量在每个时刻保持的值。如果你玩了一段时间,先休息一下,或者做点别的事情。

然后尽可能将变量设置为local(阅读:到处),找出循环内部和外部需要什么,然后重试。

备注

您可以只写if not something,而不是if something == nil,而if something ~= nil 只写if something

道歉

很抱歉文字很长,在括号内使用空格,但我希望事情特别容易理解。

【讨论】:

  • 我会试一试,这是我第一次在 Lua 上编码,或者完全编码。这让我非常困惑,但我会尝试使用它。谢谢,
猜你喜欢
  • 1970-01-01
  • 2020-02-18
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
相关资源
最近更新 更多