2012-01-06 2 views
0

나는 알아 내려고 노력하는 데 시간을 쏟았다는 문제가 있지만 루아는 여전히 비교적 새로운 것이기 때문에 그것이 작동하지 않는 이유를 알 수는 없습니다.루아 : 값이 없다면 테이블에 값을 만드십시오 - 무엇이 누락 되었습니까?

다음은 내가하려는 일입니다. 처음 항목을 첨가하는 경우 spikeRates 테이블에 항목이 표시되지 않으므로 추가해야합니다. 전에 아이템을 spiked했지만 spiking하고있는 아이템을 사용하지 않았다면 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 논리가 약간 혼란스러워 보입니다. 과 같이,이 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] 또는 print ("처음 spiking"입니다 .itemSpiked .. " ! ") 또는 {}'. 혼란 스러울 때 이것을 무시하십시오. – Deco

+0

그는 멋진 데코입니다. 그런 식으로 생각하지 않았습니다! – jpjacobs

+0

인쇄 메시지가 꼭 필요합니다. 사용자에게 알려주는 출력이며, elseif 부분의 이유는 과거에 해당 항목을 모두 스파이크했는지 여부를 출력하기 때문이었습니다. 그 특별한 스파이크로 스파이크 시켰어. 내가 wxluaedit에서 시도한, 그리고 그것은 여전히 ​​nil (V) 값을 연결하려고 시도에 대한 오류를 반환합니다. 문제가 무엇인지 확실하지 않습니다. – Josh