2012-01-06 7 views
0

私は、何時間も費やしたことがありませんでしたが、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)を連結しようとするエラーが発生します。すべてが正しいように見える、またはそう思った。完全に明白な何かが欠けていますか?ありがとう!

答えて

5

if-elseロジックはちょっと混乱しているようです。そのように、2つのIFSに分離してみてください。

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 

このvariable = variable or defaultValueは非常に一般的ですが、ルアのイディオム、あなたはそれを非常によく見るでしょう。

+2

あなたが自信を持っていて、デバッグプリントを入れたいと思うなら、あなたはこれをすることができます: 'spikeRates [itemSpiked] = spikeRates [itemSpiked] or print("これはあなたの初めてのスパイクです "..itemSpiked .." ! ")または{}'あなたが混乱している場合は、これを無視してください。 – Deco

+0

彼は素晴らしいデコですが、そのようにすることは考えていませんでした! – jpjacobs

+0

印刷メッセージが確実に必要です。それはユーザーに知らせるようにユーザーに出力され、elseif部分の理由は、過去にその項目をスパイクしてしまったかどうかを出力するようになっていて、もしあれば、その特定のスパイクでそれをスパイクしました。私はwxluaeditで両方を試しましたが、nil(v)の値を連結しようとするとエラーが返されます。問題が何であるかわからない... – Josh

関連する問題