【问题标题】:table values with valor lua具有 valor lua 的表值
【发布时间】:2011-12-13 14:45:09
【问题描述】:

所以我正在制作一个脚本,我得到了一个函数:

loot()

返回:

{"3 gold coins"}
{"3 gold coins"}
{"nothing"}
{"6 gold coins", "a hand axe"}
{"12 gold coins", "a hand axe"}

我希望将该函数包含在表格中,表格应为“a”、“an”、“单词前没有数字”=1

所以表格读取并做一个计数示例:

table = {"gold coins"=24,"nothing"=1,"hand axe"=2}

这是我正在寻找的那种表,但目前我没有成功。就像我在我的函数loot() 返回这些消息之前所说的那样,这些不是战利品读取的唯一消息,但我想将它们的数字或“a”、“an”保存为 1 的数字值,所以如果它是“6金币”除此 6 并在表中属于消息“金币”时将其增加。我希望你能理解我的意思。

这样做的目的是显示表格值以便我可以这样做:

table["gold coin"] = 24

 table = {["item"]="count",}

所以我可以请求密钥。我真的想要一个增加键的表,而不是常规表,但我就是不知道该怎么做......

提前致谢

如果你能解释我的每一个部分,我将非常感激:)

其他一些消息:

{"11 gold coins", "a leather helmet", "meat", "a spear", "a gold coin"}
{"a gold coin"}

顺便说一句,我用来执行此操作的程序非常受限制。我可以使用它,它在 lua 手册 5.1 链接下:http://www.lua.org/manual/5.1/manual.html

元表不是一种选择:/

【问题讨论】:

  • loot 是否返回单独的返回值或包含这些内容的表?
  • 它几乎是 i,j 的回归,但我真的很难解释它所以这里是:
  • 确定我的消息有问题,所以我在第一篇文章中添加了它,以便更好地理解
  • 你能正确格式化吗?
  • 好吧,是的,我可以用 loot() 做任何我想做的事,因为我创建了它,返回这个消息,但我不知道你有什么正确的意图,它会返回每条消息的内容我从服务器中寻找的类型,只给我重要的东西而不是小时,以及 x 生物的战利品,所以该函数返回“只是战利品”

标签: count lua


【解决方案1】:

您需要的第一件事是从字符串中提取数字和项目名称的函数。下面的代码将读取“a spear”或“11 spears”之类的内容,并返回 1,“spear”和 11,“spear”。

function parseAmountAndItem(str)
  assert(type(str)=="string", "Expected a string. Got a " .. type(str))
  -- handle "nothing"
  if str == "nothing" then return nil end
  local item, amount

  -- return 1 when it begins with a/an + space
  _,_,item = str:find("^an? (.+)$")
  if item then
    amount = 1
  else -- it should begin with a number + space + singular + s
    _,_,amount,item = str:find("^(%d%d?%d?%d?%d?) (.+)s$")
    assert(amount and item, "Could not parse the string: " .. str)
    amount = tonumber(amount)
  end
  return amount, item
end

然后您需要累积这些值。这应该有效:

function accumulatedLoot()
  local result = {}
  local amount, item
  for _,row in ipairs(loot())
    for _,str in ipairs(row)
      local amount, item = parseAmountAndItem(str)
      if item then
        result[item] = (result[item] or 0) + amount
      end         
    end
  end

  return result
end

几个警告:

  • 这些都是我手写的,没有经过测试。它可能会有一些语法错误和/或错误。
  • 我假设您所有项目的复数形式都是单数形式+“s”。 Real English is much more complicated。您可能需要存储一个不规则复数表并将其与 str 进行比较,而不是像我在代码中那样删除 s。

【讨论】:

  • 我从来没有见过那些双 _,那是为了什么,我怎样才能从 1 中调用这些值,以便我可以为 count 做 result["item"]?在理解这个函数打印什么样的表格时遇到一些问题,这是一个很好的答案
  • _ 的意思是“我不在乎这个值”。这与创建一个名为 dummy 的变量相同:dummy, dummy, amount, item = str:find(...)
  • "我怎样才能从 1 中调用这些值,以便我可以为计数做 result["item"]" -> 我不知道你的意思
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
  • 2012-10-16
  • 1970-01-01
  • 2019-12-14
  • 2020-09-08
  • 2016-03-07
  • 1970-01-01
相关资源
最近更新 更多