1

私は追跡データベースを作成し、時間、日、週、月、年、レベルごと、クラスごと、層ごとにレポートする情報を収集しています。そのため、さまざまなレポート (つまり、など)trackerを反映した、テーブルのサブセットで構成されるという名前のテーブルがあります。table["ThisHour"]本当に同じ情報を追加しているだけのこれらすべての行を統合する方法があるかどうか疑問に思っています。以下は、私が使用している関数と、2 つのサブテーブル (上にリストした 8 つの代わりに) です。

function exp_update(xp, gold, str, con, dex, wis, int, luck, bpracs, btrains, pracs, trains, qp)
local xtable = tracker[playername]["Exp"]
addto(xtable["ThisHour"],"Exp",xp)
addto(xtable["ThisHour"],"Gold",gold)
addto(xtable["ThisHour"],"BonusStr",str)
addto(xtable["ThisHour"],"BonusCon",con)
addto(xtable["ThisHour"],"BonusDex",dex)
addto(xtable["ThisHour"],"BonusWis",wis)
addto(xtable["ThisHour"],"BonusInt",int)
addto(xtable["ThisHour"],"BonusLuck",luck)
addto(xtable["ThisHour"],"BonusPracs",bpracs)
addto(xtable["ThisHour"],"BonusTrains",btrains)
addto(xtable["ThisHour"],"Pracs",pracs)
addto(xtable["ThisHour"],"Trains",trains)
addto(xtable["ThisHour"],"Qp",qp)
addto(xtable["ThisHour"],"Quests")
addto(xtable["ThisLevel"],"Exp",xp)
addto(xtable["ThisLevel"],"Gold",gold)
addto(xtable["ThisLevel"],"BonusStr",str)
addto(xtable["ThisLevel"],"BonusCon",con)
addto(xtable["ThisLevel"],"BonusDex",dex)
addto(xtable["ThisLevel"],"BonusWis",wis)
addto(xtable["ThisLevel"],"BonusInt",int)
addto(xtable["ThisLevel"],"BonusLuck",luck)
addto(xtable["ThisLevel"],"BonusPracs",bpracs)
addto(xtable["ThisLevel"],"BonusTrains",btrains)
addto(xtable["ThisLevel"],"Pracs",pracs)
addto(xtable["ThisLevel"],"Trains",trains)
addto(xtable["ThisLevel"],"Qp",qp)
addto(xtable["ThisLevel"],"Quests")
end

ご覧のとおり、サブテーブルが 2 つだけでもかなりの数の行になっています。これは、サブテーブルごとに 14 行のコードです。これらをすべて含めると、112 行のコードになりますが、これをできるだけ少なく統合したいと考えています。

addto 関数は、必要な場合に備えて定義されているとおりです。

function addto(t,k,v)
t[k] = t[k] + (v or 1)
end
4

1 に答える 1

3

私はこれを行うと思います:

local function exp_update_actual(vars)
  local blocks = {"ThisHour", "ThisLevel"} --Add others as needed.
  local xtable = tracker[playername]["Exp"]

  for i, block in ipairs(blocks) do
    for key, value in pairs(vars) do
      addto(xtable[block], key, value)
    end
  end
end

function exp_update(xp, gold, str, con, dex, wis, int, luck, bpracs, btrains, pracs, trains, qp)
  local vars =
  {
    Exp = xp or false,  --nil keys won't exist. false ones will.
    Gold = gold or false,
    BonusStr = str or false,
    BonusCon = con or false,
    BonusDex = dex or false,
    BonusWis = wis or false,
    BonusInt = int or false,
    BonusLuck = luck or false,
    BonusPracs = bpracs or false,
    BonusTrains = btrains or false,
    Pracs = pracs or false,
    Trains = trains or false,
    Qp = qp or false,
    Quests = false,
  }
  exp_update_actual(vars);
end
于 2012-04-01T01:11:06.373 に答える