2014-08-31 4 views
2
players={} 
players["foo"] = 
     { 
      wins = 0, deaths = 0, draws = 0, rounds = 0, bet = "None", rank = 0 
     } 
modify = function (stat, set, target) 
    local player = players[target] 
    local dictionary = 
      { 
      ["wins"] = player.wins, ["deaths"] = player.deaths, 
      ["draws"] = player.draws, ["rounds"] = player.rounds, 
      ["bet"] = player.bet, ["rank"] = player.rank, 
      } 
    if dictionary[stat] then 
     dictionary[stat] = set 
     print(dictionary[stat]) 
     print(player.wins) 
    end 
end 

modify("wins", 1, "foo") 

위에서 언급 한 코드는 실제로 작동하지 않습니다. 그것은 "wins"키를 수정하지만 그것이 자기 (player [target] .wins) 값은 수정되지 않습니다.키를 수정하지만 실제로 값을 수정하지 않습니까?

답변

2

숫자 값은 참조가 아닙니다. 참조가 아닌 원래 위치로 복사 할 때 사본을 얻습니다.

따라서 ["wins"] = player.wins을 할당하면 플레이어 테이블의 wins 필드에 대한 참조가 표시되지 않습니다. 값을 dictionary 테이블에 복사하고 있습니다.

플레이어 테이블을 수정하려면 플레이어 테이블을 수정해야합니다.

또한이 함수의 간접 참조는 완전히 필요하지 않습니다. player[stat]은 참조 할 수있는 것과 동일하게 dictionary[stat]을 참조 할 수 있습니다.

tbl.stattbl["stat"] 인 경우 syntactic sugar [1]입니다.

또한으로는 루아 설명서의 §2.5.7에서 볼 :

tbl = { 
    stat = 0, 
} 

은 숫자로 시작하지 않는,

이름이 문자열
tbl = { 
    ["stat"] = 0, 
} 

과 동일하고,하지 예약 토큰

[1] The type table 단락을 참조하십시오.

+0

오, 나는 stat가 문자열 감사 일 것이기 때문에 wouldnt 일로 생각했다! – user3603592

+0

'tbl.stat'은'tbl [ "stat"]'에 대한 구문 적 설탕입니다. 내 편집을 참조하십시오. –

+0

해명 해 주셔서 감사합니다. – user3603592