Lua: Если нет значения, то создать значение в таблице - Что мне не хватает? - PullRequest
0 голосов
/ 06 января 2012

У меня есть проблема, которую я часами пытался выяснить, но, поскольку Lua все еще относительно нов для меня, я не могу понять, почему она не работает.

Вот что я пытаюсь сделать. Если я добавляю элемент в первый раз, он не будет отображаться в таблице spikeRates, поэтому мне нужно добавить его. Если раньше я добавил элемент, но никогда не использовал элемент, с которым добавлял, то мне нужно отразить это в таблице spikeRates [itemSpiked]. Код, который я написал, выглядит следующим образом, но не заполняет таблицу.

spikeRates={}
itemSpiked = "leather"
mySpike = "iron"

if not spikeRates[itemSpiked] then
   spikeRates[itemSpiked]={}
   spikeRates[itemSpiked][mySpike]={}
   print("This is your first time spiking "..itemSpiked.."!") 
 elseif not spikeRates[itemSpiked][mySpike] then 
   spikeRates[itemSpiked][mySpike]={Failure=0,Success=0} 
   print("This is your first time spiking "..itemSpiked.." with "..mySpike.."!")
end

for i,v in pairs(spikeRates) do 
  print(i .. ": " .. v) 
end

При запуске я получаю сообщение об ошибке при попытке объединить значение nil (v) для печати базы данных. Все выглядит правильно, или я так думал. Я что-то упускаю совершенно очевидное? Спасибо!

1 Ответ

5 голосов
/ 06 января 2012

Логика if-else кажется немного запутанной.Попробуйте разделить его на два if, например, так:

spikeRates={}

itemSpiked = "leather"
mySpike = "iron"

if not spikeRates[itemSpiked] then
  spikeRates[itemSpiked]={}
  print("This is your first time spiking "..itemSpiked.."!")
end 
if not spikeRates[itemSpiked][mySpike] then 
  spikeRates[itemSpiked][mySpike]={Failure=0,Success=0} 
  print("This is your first time spiking "..itemSpiked.." with "..mySpike.."!")
end

for i,v in pairs(spikeRates) do 
  print(i .. ": " .. v) 
end

Если вам не нужны отладочные отпечатки, вот более простая версия без ifs:

spikeRates={}

itemSpiked = "leather"
mySpike = "iron"

spikeRates[itemSpiked] = spikeRates[itemSpiked] or {}
spikeRates[itemSpiked][mySpike] = spikeRates[itemSpiked][mySpike] or {Failure=0,Success=0} 

for i,v in pairs(spikeRates) do 
  print(i .. ": " .. v) 
end

This variable = variable or defaultValue - очень распространенная идиома в Lua, вы увидите это очень часто.

...