문제

나는 Lua Unpack 기능에서 이상한 행동을 우연히 발견했습니다.

table1 = {true, nil, true, false, nil, true, nil}
table2 = {true, false, nil, false, nil, true, nil}

a1,b1,c1,d1,e1,f1,g1 = unpack( table1 )
print ("table1:",a1,b1,c1,d1,e1,f1,g1)

a2,b2,c2,d2,e2,f2,g2 = unpack( table2 )
print ("table2:",a2,b2,c2,d2,e2,f2,g2)

산출:

table1: true    nil true    false   nil nil nil
table2: true    false   nil nil nil nil nil

두 번째 포장은 매개 변수를 첫 번째 NIL 값으로 전달합니다. 나는 그것과 함께 살 수있었습니다. 첫 번째 테이블은 4를 전달합니까? 중간에 하나가없는 매개 변수. NIL이 아닌 4 개의 매개 변수가 있지만 표시되는 매개 변수는 아닙니다.

누구든지 이것을 설명 할 수 있습니까? 이것은 codepad.org 및 Lua 5.1로 시도되었습니다

도움이 되었습니까?

해결책

시작 및 종료 인덱스를 unpack() 그리고 사용 table.maxn() 결말 색인 :

table1 = {true, nil, true, false, nil, true, nil}

a1,b1,c1,d1,e1,f1,g1 = unpack( table1, 1, table.maxn(table1) )
print ("table1:",a1,b1,c1,d1,e1,f1,g1)
-->table1: true    nil     true    false   nil     true    nil

두 테이블이 어떻게 처리되는지에 대한 불일치의 진정한 이유는 테이블의 배열 부분의 길이를 결정하는 논리에 있습니다.

그만큼 luaB_unpack() 기능 사용 luaL_getn() 이와 관련하여 정의됩니다 lua_objlen() 어떤 전화 luaH_getn() 테이블 용. 그만큼 luaH_getn() 배열의 마지막 위치를보고 nil 테이블에서 경계에 대한 이진 검색을 수행합니다 ( "t [i]는 nil이 아닌 것이고 t [i+1]이 nil"). 배열 끝을위한 이진 검색은 table1 그런 다음 다르게 처리됩니다 table2.

배열의 마지막 항목이 인 경우에만 문제가됩니다. nil.

에서 LUA의 프로그래밍 (pg.16) (이 책을 사야합니다.) :배열에 구멍이있는 경우 (내부에 필수 요소) 길이 연산자는 이러한 NIL 요소를 엔드 마커로 가정 할 수 있습니다. 따라서 구멍이 포함 된 배열에서 길이 연산자를 사용하지 않아야합니다.

그만큼 unpack() 길이 연산자를 사용하고 있습니다 lua_objlen(), 이것은 [nil 요소 중 하나를 끝으로 가정 할 수있다"는 것 "을 배열의 끝으로 가정 할 수있다.

다른 팁

2.2- 값 및 유형

...] 유형 테이블 연관 배열, 즉 숫자뿐만 아니라 값 (NIL 제외)으로 색인화 될 수있는 어레이를 구현합니다. 테이블은 이질적 일 수 있습니다. 그건, 그들 모든 유형의 값을 포함 할 수 있습니다 (NIL 제외). [...]

주어진 nil 항목에 의지합니다 부서지다 테이블 열거와 변수는 제대로 시작되지 않습니다.

다음은 다음을 보여주는 간단한 예입니다 문제가 있습니다 행동:

table1 = {true, false, nil, false, nil, true, nil}
for k,v in ipairs(table1) do
  print(k, v)
end

산출:

1   true
2   false
>Exit code: 0
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top