2016-11-28 5 views
-1

세 개의 루프가 있지만 결과가 다른 이유는 무엇입니까?루아 표 값을 변경할 때?

1

local a = {{b=5}, {b=4}} 
for k,v in ipairs(a) do 
    v.b = v.b + 1 
end 

2

local a = {["b"]=5, ["bb"]=4} 
for k,v in pairs(a) do 
    v = v + 1 
end 

3.

local a = {5, 4} 
for k,v in ipairs(a) do 
    v = v + 1 
end 
    LUA (5.1)
  • 1 진정 표 A의 모든 요소에 1을 추가 할 수 있지만 2 & 3 변경 아무것도. 왜?
  • 는 I이 세 블록의 OP 코드는 제 1 블록은 이후 표 A의 값을 변경 설정 가능한 작전을 갖는 것으로 볼 수 있지만 2 또는 3이되지 않은 블록 chunkspy를 사용한다. 블록 & 그냥 할 5 5 261; 1 (즉, 5를 레지스터에 추가 하나 테이블에 값을 저장하지 않음), 이것이 일어나는 이유는 무엇입니까?
+6

'v'는 루프 내부에 존재하는 간단한 로컬 변수이기 때문에. 'v' 자체를 수정해도 테이블의 데이터는 수정되지 않습니다. –

답변

1

여기서 문제는 k,vv이 값에 대한 참조가 아닌 열쇠라는 것이다.

즉, v=은 로컬 변수 v을 수정하기 만하며 테이블 자체에는 영향을 미치지 않습니다. 대신 a[k]=v+1을 사용하여 2와 3에 대한 의도 된 결과를 얻을 수 있습니다.

첫 번째 경우에는 v이 테이블에 대한 참조입니다. 그리고 루아에서는 테이블에 대한 모든 참조에 대해 테이블 ​​또는 그 테이블에 대한 참조를 수정한다. This 질문에는 References Vs Values라는 주제에 대한 유용한 정보가 포함되어 있습니다.

+0

! 내가 가지고, 쌍 및 ipair 그냥 함수를 참조 테이블 값을 반환, 맞죠? – jammyWolf

+0

예, 답변에 명시된대로. 다시 한번, 테이블을 수정하고 싶다면'k'는 그 값을 반환 한 키를 가지고 있습니다. 그래서'v'가 업데이트되지 않더라도'a [k] = something'이 당신을 위해 그 값을 설정할 것입니다. – ATaco

+0

thanks again ~~~~ – jammyWolf